C++ 正在使用未初始化的变量

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

我正在读这个 我在代码方面遇到了问题。我使用的是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而不是教程中显示的字符,并对其进行编译,但当我单击窗口而不是显示信息窗口时,会显示一个错误:

正在使用变量“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];