在没有初始化的情况下使用变量

chn*_*ing 0 c++ winapi

我正在阅读这篇http://www.winprog.org/tutorial/window_click.html ,我遇到了代码问题.我正在使用VS 2012而不是char*const char*我必须使用LPCWSTRLPWSTR.

在这种特殊情况下,问题出在开关中

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;
}
Run Code Online (Sandbox Code Playgroud)

我使用LPWSTR而不是教程中显示的char,我编译它但是当我点击窗口而不是显示信息窗口时出现错误:

The variable 'szFileName' is being used without being initialized.

据我所知,它GetModuleFileName()应该szFileName在开始时写入空的信息,所以我无法真正理解问题是什么.

Lig*_*ica 8

以下文档GetModuleFileName():

lpFilename [out]

指向接收模块的完全限定路径的缓冲区的指针.如果路径的长度小于nSize参数指定的大小,则函数成功,并将路径作为以null结尾的字符串返回.

你给它一个指针,但它是一个指向无限混乱的指针.您实际上没有分配缓冲区.

来吧,现在就这样做:

wchar_t szFileName[MAX_PATH];
GetModuleFileName(hInstance, szFileName, MAX_PATH);
Run Code Online (Sandbox Code Playgroud)