C++ 正在使用未初始化的变量
我正在读这个 我在代码方面遇到了问题。我使用的是VS 2012,而不是char*或const char*,我必须使用LPCWSTR或LPWSTR 在这种特殊情况下,问题出在开关上C++ 正在使用未初始化的变量,c++,winapi,C++,Winapi,我正在读这个 我在代码方面遇到了问题。我使用的是VS 2012,而不是char*或const char*,我必须使用LPCWSTR或LPWSTR 在这种特殊情况下,问题出在开关上 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_LBUTTONDOWN: { LPWST
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而不是教程中显示的字符,并对其进行编译,但当我单击窗口而不是显示信息窗口时,会显示一个错误:
正在使用变量“szFileName”,但未初始化
据我所知,GetModuleFileName应该在szFileName中写入信息,该文件开头为空,因此我无法真正理解问题所在。来源:
lpFilename[out]
指向接收模块完全限定路径的缓冲区的指针。如果路径长度小于nSize参数指定的大小,则函数将成功,路径将作为以null结尾的字符串返回
你给它一个指针,但它是一个指向无限混乱的指针。您实际上还没有分配缓冲区
现在就开始吧:
wchar_t szFileName[MAX_PATH];
GetModuleFileName(hInstance, szFileName, MAX_PATH);
您需要声明一个数组,而LPWSTR只是一个指针 所以改变
LPWSTR szFileName;
到
最好使用TCHAR,它将是char或wchar\t,这取决于是否使用Unicode。您的版本更脆弱。@LightnessRacesinOrbit:这假设任何未从旧NT以前的windows主动移植到更现代的操作系统的应用程序都将编译为UTF-16和字符。@Deduplicator:是的,好的。@LightnessRacesinOrbit:另外,如果代码被移植,而忘记启用Unicode,然后Claptrap的代码将无法编译,因为它将把一个wchar_t[]传递给GetModuleFileNameA,而不是GetModuleFileNameW。@RemyLebeau:这两种方式都是正确的。教程不会传递字符*;它分配一个缓冲区:char szFileName[MAX_PATH]。我不明白你为什么随机忽略了教程的那一部分!你知道TCHAR和类似的东西只用于将古老的windows应用程序移植到wchar\t吗?在任何其他情况下都是禁止使用的。@重复数据消除程序:足够公平。@SlaviKalov-请在这里阅读答案,因为它概括地描述了您遇到的问题:
wchar_t szFileName[MAX_PATH];