如何在g ++中“使用unicode字符集”?

时间:2019-05-19 18:33:34

标签: c++ windows unicode g++ cl

我正在使用c ++编写程序,试图在Windows中使用WriteProcessMemory()函数。为此,我需要一个获取目标进程ID的函数。我可以使用以下功能来做到这一点:

#pragma once
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>

//get process id from executable name using tlhelp32snapshot
DWORD GetProcID(wchar_t *exeName){
    PROCESSENTRY32 procEntry = {0};
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (!hSnapshot) {
        return 0;
    }
    procEntry.dwSize = sizeof(procEntry);
    if (!Process32First(hSnapshot, &procEntry)) {
        return 0;
    }
    do {
        if (!wcscmp(procEntry.szExeFile, exeName)) {
            CloseHandle(hSnapshot);
            return procEntry.th32ProcessID;
        }
    } while (Process32Next(hSnapshot, &procEntry));
    CloseHandle(hSnapshot);
    return 0;
}

//main function
int main() {
    using namespace std;

    cout << "some output" << endl;

    return 0;
}

如果我将字符集设置为unicode,我就可以使用Visual Studio进行编译,但是当我尝试使用g ++时,会出现转换错误:

g++ -std=c++17 write.cpp
write.cpp:1:9: warning: #pragma once in main file
 #pragma once
         ^
write.cpp: In function 'DWORD GetProcID(wchar_t*)':
write.cpp:21:43: error: cannot convert 'CHAR* {aka char*}' to 'const wchar_t*' for argument '1' to 'int wcscmp(const wchar_t*, const wchar_t*)'
   if (!wcscmp(procEntry.szExeFile, exeName)) {
                                           ^
write.cpp: In function 'MODULEENTRY32 GetModule(DWORD, wchar_t*)':
write.cpp:40:46: error: cannot convert 'char*' to 'const wchar_t*' for argument '1' to 'int wcscmp(const wchar_t*, const wchar_t*)'
     if (!wcscmp(modEntry.szModule, moduleName)) {
                                              ^

我可以使用以下参数使用cl进行编译:

cl /EHsc /D UNICODE write.cpp

这里/D UNICODE与进入Visual Studio>项目中的rmb>属性并将Character Set设置为Use Unicode Character Set相同。

是否可以像在cl中那样在g ++中强制执行unicode?

2 个答案:

答案 0 :(得分:1)

cl(Microsoft C / C ++编译器)和g++(Gnu C ++编译器)在某些参数上具有非常接近的参数语法。差异更多是Dos / Shell(斜线与破折号)的通常区别。

等效于/DMY_IDENTIFIER上的clg++):

-DMY_IDENTIFER

在您的情况下,这意味着:-DUNICODE

完整的编译命令行必须如下所示:

g++ -DUNICODE -std=c++17 write.cpp

答案 1 :(得分:1)

正确的答案是使用编译器开关-municode定义所需的所有内容,并链接到正确的CRT文件,以便为您提供_wmain的正确定义。

这在旧版MinGW上不可用,因此您需要一个MinGW-w64工具链。您可能已经在使用它了。如果不是这种情况,则可以从here下载安装程序。