Archive for the ‘Windows’ Category

Win骨干代码

星期二, 11 8 月, 2009

#include //Windows程序设计头文件

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口消息处理程序,固定形式。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)//Windows程序入口
{
static TCHAR szAppName[] = TEXT(“HelloWin”);
HWND hwnd;//窗口句柄
WNDCLASS wndclass;//窗口类别结构
MSG msg;//消息结构
//设置窗口类别结构
wndclass.style = CS_HREDRAW | CS_VREDRAW;//窗口类别样式。CS_HREDRAW水平方向、CS_VREDRAW垂直方向大小改变时,窗口重绘。
wndclass.lpfnWndProc = WndProc;//设定WndProc为此窗口类别的窗口消息处理程序
//预留额外空间
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
//
wndclass.hInstance = hInstance;//程序执行的实体句柄
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//加载、设置图标
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//加载、设置鼠标光标
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景色
wndclass.lpszMenuName = NULL;//菜单
wndclass.lpszClassName = szAppName;//窗口类别名
/*RegisterClass函数只有一个参数,即指向WNDCLASS结构的指针。
实际上,RegisterClassA函数将获得一个指向WNDCLASSA结构的指针,而RegisterClassW函数将获得一个指向WNDCLASSW结构的指针。
程序要使用哪个函数来注册窗口类别,取决于发送给窗口的消息包含ASCII文字还是Unicode文字。

现在有一个问题:如果用定义的UNICODE标识符编译了程序,程序将呼叫RegisterClassW。
该程序可以在Microsoft Windows NT中执行良好。
但如果此程序在Windows 98上执行,RegisterClassW函数并未真地被执行到。函数有一个进入点,但函数呼叫后只传回0,表明错误。

由于MessageBoxW是可在Windows 98环境下执行的几个Unicode函数之一,所以下面过程其执行正常。
*/
if(!RegisterClass(&wndclass))//注册窗口类别
{
MessageBox(NULL, TEXT(“This program requires Windows NT!”), szAppName, MB_ICONERROR);
return 0;
}
//CreateWindow发送WM_CREATE消息
hwnd = CreateWindow(szAppName, // window class name
TEXT (“The Hello Program”), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow(hwnd, iCmdShow);//显示窗口
UpdateWindow(hwnd);//更新窗口。发送WM_PAINT消息重绘。
//消息循环
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_CREATE:
PlaySound(TEXT(“hellowin.wav”), NULL, SND_FILENAME | SND_ASYNC);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, TEXT(“Hello Windows XP!”), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

MusicPlayer

星期三, 5 8 月, 2009

核心代码:
#include //滚动条控制时包含头文件
#include //文件夹选择对话框包含头文件

TCHAR szFileName[80][MAX_PATH];//播放列表
int iNum = 0;//音乐数
int iPlay = 0;//播放状态:0未播放 1正在播放 2暂停
int iPlayListIndex = 0;//播放列表索引
int iLength;//播放文件时长秒数

Main_Proc处理里添加:
HANDLE_MSG(hWnd, WM_HSCROLL, Main_OnHScroll);//水平滚动条消息。WM_VSCROLL垂直滚动条消息。

Main_OnInitDialog初始化添加:
//音量滚动条
//设置滚动条取值范围
//参考:http://www.rupeng.com/forum/redirect.php?fid=32&tid=601&goto=nextoldset
//http://hi.baidu.com/mowm/blog/item/c76d07ee77e5101efcfa3cd0.html
SendMessage(GetDlgItem(hwnd, IDC_TRBVOLUME), TBM_SETRANGEMIN, TRUE, 0);//最小值
SendMessage(GetDlgItem(hwnd, IDC_TRBVOLUME), TBM_SETRANGEMAX, TRUE, 1000);//最大值
SendMessage(GetDlgItem(hwnd, IDC_TRBVOLUME), TBM_SETPOS, TRUE, 1000);//当前位置

////////////////////////////////////////////////////////////////////////////////
// Main_OnCommand
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_BTNOPENFILES://添加文件按钮
OpenFiles(hwnd);
break;
case IDC_BTNSELECTFOLDER:
SelectFolder(hwnd);
break;
case IDC_BTNPLAY://播放暂停按钮
if(0 == iPlay)//未播放
{
//获得选中项播放列表索引
iPlayListIndex = SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_GETCURSEL, 0, 0);
//播放选中项,改变播放状态。
Play(hwnd, iPlayListIndex);
//改变按钮显示文字
SetWindowText(hwndCtl, “暂停”);
}
else if(1 == iPlay)//正在播放
{
//暂停正在播放文件
mciSendString(“pause OpenMusicFile”, (LPTSTR)NULL, 0, NULL);
//改变播放状态
iPlay = 2;
//改变按钮显示文字
SetWindowText(hwndCtl, “播放”);
}
else//暂停
{
//恢复暂停播放文件
mciSendString(“play OpenMusicFile”, (LPTSTR)NULL, 0, NULL);
//改变播放状态
iPlay = 1;
//改变按钮显示文字
SetWindowText(hwndCtl, “暂停”);
}
break;
case IDC_BTNPREV://上一首
//获得上一首播放列表索引
iPlayListIndex = SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_GETCURSEL, 0, 0) – 1;
if(iPlayListIndex >= 0)//索引在范围内
{
Play(hwnd, iPlayListIndex);
//设置上一首为选中项
SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_SETCURSEL, iPlayListIndex, 0);
SetWindowText(GetDlgItem(hwnd, IDC_BTNPLAY), “暂停”);
}
break;
case IDC_BTNNEXT://下一首
iPlayListIndex = SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_GETCURSEL, 0, 0) + 1;
if(iPlayListIndex < iNum) { Play(hwnd, iPlayListIndex); SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_SETCURSEL, iPlayListIndex, 0); SetWindowText(GetDlgItem(hwnd, IDC_BTNPLAY), "暂停"); } break; case IDC_LST1://列表消息 switch(codeNotify) { case LBN_SELCHANGE://选中项改变 //获得选中项播放列表索引 int iChange = SendMessage(hwndCtl, LB_GETCURSEL, 0, 0); if(iChange != iPlayListIndex)//索引改变 { iPlay = 0;//新文件未播放 SetWindowText(GetDlgItem(hwnd, IDC_BTNPLAY), "播放"); } else//索引未改变 { iPlay = 1;//文件正在播放 SetWindowText(GetDlgItem(hwnd, IDC_BTNPLAY), "暂停"); } break; case LBN_DBLCLK://双击某项 iPlayListIndex = SendMessage(hwndCtl, LB_GETCURSEL, 0, 0); Play(hwnd, iPlayListIndex); SetWindowText(GetDlgItem(hwnd, IDC_BTNPLAY), "暂停"); break; default:break; } break; default:break; } } void Main_OnHScroll(HWND hwnd, HWND hwndCtl, UINT code, int pos)//固定格式? { if(hwndCtl == GetDlgItem(hwnd, IDC_TRBVOLUME)) SetVolume(hwnd); else SetPlayProcess(hwnd); } void OpenFiles(HWND hwnd) { OPENFILENAME ofn; TCHAR szOpenFileNames[80*MAX_PATH];//文件路径 TCHAR szPath[MAX_PATH];//基路径 TCHAR* p; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szOpenFileNames; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof(szOpenFileNames); ofn.lpstrFilter = TEXT("音乐文件(mp3、wma、wav)\0*.mp3;*.wma;*.wav\0所有文件(*.*)\0*.*\0"); ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if(GetOpenFileName(&ofn)) { //单个文件的保存形式为:绝对路径\0 //多个文件的保存形式为:基路径\000文件一\000文件二\0 //注意路径"\"的转义为"\\" //把路径复制到szPath //参考资料:http://blog.csdn.net/xuminggang/archive/2009/05/21/4206010.aspx lstrcpyn(szPath, szOpenFileNames, ofn.nFileOffset+1); //根据单个和多个文件不同的保存形式,多文件基路径需加"\\"。 szPath[ofn.nFileOffset-1] = '\\'; //把指针移到第一个文件 p = szOpenFileNames + ofn.nFileOffset; iPlayListIndex = iNum;//加入的第一个文件 while(*p) { lstrcat(szFileName[iNum], szPath); //基路径 lstrcat(szFileName[iNum], p); //基路径+文件=绝对路径 //加入列表 //ListBox参考:http://www.cnitblog.com/netssfy/archive/2007/06/12/28347.html SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_ADDSTRING, 0, (LPARAM)p); p += lstrlen(p) +1; //移至下一个文件 iNum++; //增加音乐数,移动准备接收下一个文件路径。 } //设置选中项 SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_SETCURSEL, (WPARAM)iPlayListIndex, 0); //播放选中项 Play(hwnd, iPlayListIndex); } } void Play(HWND hwnd, int iPlayListIndex) { TCHAR szMCIInfo[256]; //MCI操作返回信息 TCHAR szShortFileName[MAX_PATH]; //短文件名 ZeroMemory(szShortFileName, sizeof(szShortFileName)); //关闭正在播放的文件 //OpenMusicFile是通过MCI Command String中alias设置文件别名 mciSendString("close OpenMusicFile", szMCIInfo, sizeof(szMCIInfo), NULL); //参考:http://www.programfan.com/doc/vbapi/GetShortPathName.htm //http://topic.csdn.net/t/20060926/15/5049254.html //否则播放不了路径带空格的文件 GetShortPathName(szFileName[iPlayListIndex], szShortFileName, sizeof(szShortFileName)); //MCI Command String //参考:http://tieba.baidu.com/f?kz=26410588 TCHAR szCMD[2*MAX_PATH]; wsprintf(szCMD, "open %s alias OpenMusicFile", szShortFileName); //打开文件 mciSendString(szCMD, szMCIInfo, sizeof(szMCIInfo), NULL); //播放文件 mciSendString("play OpenMusicFile", szMCIInfo, sizeof(szMCIInfo), NULL); mciSendString("status OpenMusicFile length", szMCIInfo, sizeof(szMCIInfo), NULL);//szMCIInfo获得播放时长毫秒数 iLength = atoi(szMCIInfo)/1000;//播放时长秒数 //设置进度滚动条取值范围 SendMessage(GetDlgItem(hwnd, IDC_TRBPROCESS), TBM_SETRANGEMIN, TRUE, 0); SendMessage(GetDlgItem(hwnd, IDC_TRBPROCESS), TBM_SETRANGEMAX, TRUE, iLength); //设置定时器,更新进度滚动条。 SetTimer(hwnd, 1, 1000, PlayProcess); //设置音量 SetVolume(hwnd); //改变播放状态 iPlay = 1; //改变按钮显示文字 SetWindowText(GetDlgItem(hwnd, IDC_BTNPLAY), "暂停"); } void SetVolume(HWND hwnd) { //获得音量滚动体当前位置 int iVolume = SendMessage(GetDlgItem(hwnd, IDC_TRBVOLUME), TBM_GETPOS, 0, 0); //设置音量 TCHAR szVolume[256]; wsprintf(szVolume, "setaudio OpenMusicFile volume to %d", iVolume); mciSendString(szVolume, (LPTSTR)NULL, 0, 0); } void SetPlayProcess(HWND hwnd) { if(0 == iPlay)//未播放时不能拖动滚动条 SendMessage(GetDlgItem(hwnd, IDC_TRBPROCESS), TBM_SETPOS, TRUE, 0); else if(1 == iPlay)//只能在播放时拖动进度滚动条 { TCHAR szPlayProcess[256]; int iPosition = SendMessage(GetDlgItem(hwnd, IDC_TRBPROCESS), TBM_GETPOS, 0, 0)*1000;//拖动位置毫秒数 wsprintf(szPlayProcess, "play OpenMusicFile from %d", iPosition); mciSendString(szPlayProcess, (LPTSTR)NULL, 0, 0); } } void CALLBACK PlayProcess(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) { TCHAR szMCIInfo[256];//MCI操作返回信息 mciSendString("status OpenMusicFile position", szMCIInfo, sizeof(szMCIInfo), NULL);//szMCIInfo获得播放当前位置毫秒数 int iPosition = atoi(szMCIInfo)/1000;//播放当前位置秒数 //更新播放时间 TCHAR* szBuffer; FormatTime(iLength, iPosition, szBuffer); SetWindowText(GetDlgItem(hwnd, IDC_STCTIME), szBuffer); SendMessage(GetDlgItem(hwnd, IDC_TRBPROCESS), TBM_SETPOS, TRUE, iPosition);//设置进度滚动条位置 if(iPosition == iLength)//结束 { mciSendString("close OpenMusicFile", (LPTSTR)NULL, 0, 0); iPlay = 0; SetWindowText(GetDlgItem(hwnd, IDC_BTNPLAY), TEXT("播放")); } } void FormatTime(int iLength, int iPosition, TCHAR* szBuffer) { int iLengthMinute, iLengthSecond, iPositionMinute, iPositionSecond; iLengthMinute = iLength/60;//总时长分钟 iLengthSecond = iLength-iLengthMinute*60;//总时长秒钟 iPositionMinute = iPosition/60;//当前时长分钟 iPositionSecond = iPosition - iPositionMinute*60;//当前时长秒钟 //显示 wsprintf(szBuffer, "%02d:%02d / %02d:%02d", iPositionMinute, iPositionSecond, iLengthMinute, iLengthSecond); } //文件夹选择对话框 //参考:http://blog.csdn.net/ShardowM/archive/2008/06/06/2516213.aspx //http://topic.csdn.net/t/20021103/14/1143060.html //http://www.programfan.com/blog/article.asp?id=19614 void SelectFolder(HWND hwnd) { LPMALLOC lpMalloc = NULL; if(SUCCEEDED(SHGetMalloc(&lpMalloc))) { TCHAR szPath[MAX_PATH]; BROWSEINFO bi; LPITEMIDLIST pidl; //LPBYTE pBuf = (LPBYTE)CoTaskMemAlloc(sizeof(bi)); ZeroMemory(&bi, sizeof(bi));//注意结构体的置零 bi.hwndOwner = hwnd; bi.pidlRoot = NULL; bi.pszDisplayName = szPath; bi.lpszTitle = TEXT("选择目录:"); bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_BROWSEFORCOMPUTER; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; if((pidl = SHBrowseForFolder(&bi)) != NULL)//显示文件夹选择对话框并操作 { SHGetPathFromIDList(pidl, szPath);//转换文件夹路径 FindAllFile(hwnd, szPath, "*.mp3");//查找文件夹下mp3文件 FindAllFile(hwnd, szPath, "*.wma");//wma FindAllFile(hwnd, szPath, "*.wav");//wav //MessageBox(NULL, szPath, "", MB_OK); } //CoTaskMemFree(pBuf); lpMalloc->Free(pidl);
lpMalloc->Release();
}
}

//是否是根目录
//根目录路径如:F:\
//非根目录路径如:F:\Music
BOOL IsRoot(LPCTSTR lpszPath)
{
return 3 == lstrlen(lpszPath);
}

//遍历文件夹,找出指定后缀文件。
//参考:http://www.programfan.com/club/showpost.asp?id=18098
//http://hi.baidu.com/csuhkx/blog/item/cb66ff00d82bc610738b6521.html
void FindAllFile(HWND hwnd, LPCTSTR lpszPath, LPCTSTR lpszSuffix)
{
WIN32_FIND_DATA wfd;
TCHAR szPath[MAX_PATH];
lstrcpy(szPath, lpszPath);
if(!IsRoot(szPath))//非根目录加上”\\”
lstrcat(szPath, “\\”);
lstrcat(szPath, lpszSuffix);//加上后缀
HANDLE hFind = FindFirstFile(szPath, &wfd);
if(INVALID_HANDLE_VALUE == hFind)//未找到文件,返回。
return;
do
{
if(‘.’ == wfd.cFileName[0])
continue;
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//如果是目录,递归进入目录遍历。
{
if(IsRoot(lpszPath))//根目录
wsprintf(szPath, “%s%s”, lpszPath, wfd.cFileName);
else//非根目录
wsprintf(szPath, “%s\\%s”, lpszPath, wfd.cFileName);
FindAllFile(hwnd, szPath, lpszSuffix);
}
else
{
if(IsRoot(lpszPath))//根目录
wsprintf(szPath, “%s%s”, lpszPath, wfd.cFileName);
else//非根目录
wsprintf(szPath, “%s\\%s”, lpszPath, wfd.cFileName);
lstrcpy(szFileName[iNum++], szPath);
SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_ADDSTRING, 0, (LPARAM)wfd.cFileName);
//MessageBox(NULL, szPath, “”, MB_OK);
}
}while(FindNextFile(hFind, &wfd));
FindClose(hFind);
iPlayListIndex = iNum-1;//加入的最后一个文件
//设置选中项
SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_SETCURSEL, (WPARAM)iPlayListIndex, 0);
//播放选中项
Play(hwnd, iPlayListIndex);
}

MusicPlayer

MCI参考资料

星期一, 3 8 月, 2009

http://baike.baidu.com/view/396376.htm

http://www.leadbbs.com/a/a.asp?B=205&ID=1655937

文件多选修改

星期一, 3 8 月, 2009

编写MusicPlayer时,对文件多选进行了修改。
void OpenFiles(HWND hwnd)
{
OPENFILENAME ofn;
TCHAR szOpenFileNames[80*MAX_PATH];//文件路径
TCHAR szPath[MAX_PATH];//基路径
TCHAR* p;
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szOpenFileNames;
ofn.lpstrFile[0] = ‘\0’;
ofn.nMaxFile = sizeof(szOpenFileNames);
ofn.lpstrFilter = TEXT(“音乐文件(mp3、wma、wav)\0*.mp3;*.wma;*.wav\0所有文件(*.*)\0*.*\0″);
ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(GetOpenFileName(&ofn))
{
//单个文件的保存形式为:绝对路径\0
//多个文件的保存形式为:基路径\000文件一\000文件二\0
//注意路径”\”的转义为”\\”
//把路径复制到szPath
//参考资料:http://blog.csdn.net/xuminggang/archive/2009/05/21/4206010.aspx
lstrcpyn(szPath, szOpenFileNames, ofn.nFileOffset+1);
//根据单个和多个文件不同的保存形式,多文件基路径需加”\\”。
szPath[ofn.nFileOffset-1] = ‘\\’;
//把指针移到第一个文件
p = szOpenFileNames + ofn.nFileOffset;
int iPlayListIndex = iNum;//加入的第一个文件
while(*p)
{
lstrcat(szFileName[iNum], szPath); //基路径
lstrcat(szFileName[iNum], p); //基路径+文件=绝对路径
//加入列表
SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_ADDSTRING, 0, (LPARAM)p);
p += lstrlen(p) +1; //移至下一个文件
iNum++; //增加音乐数,移动准备接收下一个文件路径。
}
//设置选中项
SendMessage(GetDlgItem(hwnd, IDC_LST1), LB_SETCURSEL, (WPARAM)iPlayListIndex, 0);
//播放选中项
Play(hwnd, iPlayListIndex);
SetVolume(hwnd);
bPlay = TRUE;
SetWindowText(GetDlgItem(hwnd, IDC_BTNPLAY), “暂停”);
}
}

基于Socket的授时程序

星期五, 24 7 月, 2009

#include <windowsx.h>
#include <winsock2.h>

#define HIGHTIME 21968699 // 21968708 // Jan 1, 1900 FILETIME.highTime
#define LOWTIME 4259332096 // 1604626432 // Jan 1, 1900 FILETIME.lowtime

void WinSocket()
{
 WSADATA wsaData; 
 WSAStartup(MAKEWORD(2, 0), &wsaData);//初始化Socket库,“2,0”为版本号。
 SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//套接字,即连接线。
 SOCKADDR_IN sa;
 sa.sin_family = AF_INET; 
 sa.sin_port = htons(IPPORT_TIMESERVER);//设置连接服务器端端口
 sa.sin_addr.S_un.S_addr = inet_addr(“210.72.145.8”);//ping www.time.ac.cn
 //客户端端口动态分配、自动生成。
 if(connect(sock, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
 {
  ShowError();
  return;
 }
    //
    // Add code here
    //
 unsigned long ulTime;
 //接收时间消息
 recv(sock, (char*)&ulTime, sizeof(unsigned long), 0);
 ulTime = ntohl(ulTime);//从网络字节顺序转换为主机字节顺序
 SYSTEMTIME st;
 UINT64 uiCurTime, uiBaseTime, uiResult;
 uiBaseTime = ((UINT64) HIGHTIME << 32) + LOWTIME;
 uiCurTime = (UINT64)ulTime * (UINT64)10000000;
 uiResult = uiBaseTime + uiCurTime;
 FileTimeToSystemTime((LPFILETIME)&uiResult, &st);
 TCHAR cBuffer[256];
 ZeroMemory(cBuffer, sizeof(cBuffer));
 wsprintf(cBuffer, TEXT(“当前准确时间为:%d年%d月%d日 %d时:%d分:%d秒”), st.wYear, st.wMonth, st.wDay, st.wHour+8, st.wMinute, st.wSecond);
 //由于授时服务器返回的是格林尼治时间,中国在东八区,故st.wHour+8。
 MessageBox(NULL, cBuffer, “准确时间”, MB_OK);
 SetSystemTime(&st);
 MessageBox(NULL, TEXT(“授时成功”), TEXT(“授时成功”), MB_OK);
 closesocket(sock);
 WSACleanup();
}

void ShowError()
{
 TCHAR* lpMsgBuf;
 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |//自动分配消息缓冲区
 FORMAT_MESSAGE_FROM_SYSTEM, //从系统获取信息
 NULL, GetLastError(), //获取错误信息标识
 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //使用系统缺省语言
 (LPTSTR)&lpMsgBuf, //消息缓冲区
 0, NULL);
 MessageBox(NULL, lpMsgBuf, TEXT(“错误信息”), MB_ICONERROR);
}

电脑准确对时

可能会因缺少MSVCIRTD.DLL文件报错,将该文件下载并放入WINDOWS/system32文件夹下即可。