我正在读这个http://www.winprog.org/tutorial/window_click.html
我遇到了代码问题。我使用的是VS 2012而不是char*
或const char*
我必须使用LPCWSTR
或LPWSTR
。
在这种特殊情况下,问题出在开关
中LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN:
{
LPWSTR szFileName;
HINSTANCE hInstance = GetModuleHandle(NULL);
GetModuleFileName(hInstance, szFileName, MAX_PATH);
MessageBox(hwnd, szFileName, L"This program is:",
MB_OK | MB_ICONINFORMATION);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
我使用LPWSTR
而不是教程中显示的字符,我编译它但是当我点击窗口而不是显示信息窗口时出现错误:
The variable 'szFileName' is being used without being initialized.
据我所知,GetModuleFileName()
应该在szFileName
中写下开头为空的信息,所以我无法真正理解问题所在。
答案 0 :(得分:8)
来自the documentation for GetModuleFileName()
:
lpFilename [out]
指向接收模块的完全限定路径的缓冲区的指针。如果路径的长度小于 nSize 参数指定的大小,则函数成功,并将路径作为以null结尾的字符串返回。
你给它一个指针,但它是指向无限混乱的指针。您实际上没有分配缓冲区。
继续现在就这样做:
wchar_t szFileName[MAX_PATH];
GetModuleFileName(hInstance, szFileName, MAX_PATH);
答案 1 :(得分:2)
您需要声明一个数组,LPWSTR只是一个指针
所以改变
LPWSTR szFileName;
到
wchar_t szFileName[MAX_PATH];