C2664错误,C ++对我来说很陌生

时间:2013-12-01 00:06:19

标签: c++ compiler-errors

我得到的错误是:

"DWORD GetModuleFileNameW(HMODULE,LPWSTR,DWORD)' : cannot convert parameter 2 from 'char *' to 'LPWSTR"

在这一行

GetModuleFileName(NULL, &strL[0], MAX_PATH);

这个代码

    BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        {
            std::string strL;
            strL.resize(MAX_PATH);
            GetModuleFileName(NULL, &strL[0], MAX_PATH);

            DisableThreadLibraryCalls(hModule);

            if(strL.find("notepad.exe") != std::string::npos)
            {
                gl_hThisInstance = hModule;

                LoadOriginalDll();
            }

            break;
        }
    case DLL_PROCESS_DETACH:
        {
            ExitInstance();

            break;
        }
    }
    return TRUE;
}

2 个答案:

答案 0 :(得分:3)

来自MSDN

typedef wchar_t* LPWSTR, *PWSTR;

所以期望wchar_t *(wchar_t是2个字节或更多),但&std::string[0]char*(char是一个字节)。您需要使用std::wstring代替:

std::wstring strL;

答案 1 :(得分:0)

如果您希望在不使用宽​​字符串的情况下编译代码,请参阅此处:

How do I turn off Unicode in a VC++ project?

如果在VC ++中启用了Unicode,则可能会出现如下定义:

#ifdef UNICODE
#define CreateFile  CreateFileW
#else
#define CreateFile  CreateFileA
#endif // !UNICODE

修正:

  

您是否尝试过:项目属性 - 常规 - 项目默认值 -   字符集?

     

请参阅此问题中的答案,了解“使用”之间的差异   多字节字符集“和”未设置“选项:关于”字符   在Visual Studio 2010中设置“选项”

从引文内的链接:

  

这是一个兼容性设置,适用于遗留代码   为未启用Unicode的旧版Windows编写。   Windows 9x系列中的版本,Windows ME是最后一个版本。同   所有Windows API都选择了“未设置”或“使用多字节字符集”   将字符串作为参数的函数重新定义为一点   兼容性帮助函数,用于将char *字符串转换为   wchar_t * strings,API的本机字符串类型。