【问题标题】:how to "use unicode character set" in g++?如何在 g++ 中“使用 unicode 字符集”?
【发布时间】:2019-05-19 18:33:34
【问题描述】:

我正在使用 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 on project > properties 并将Character Set 设置为Use Unicode Character Set 相同。

是否可以像在 cl 中一样在 g++ 中强制使用 unicode?​​p>

【问题讨论】:

  • 是的,g++ 有-DUNICODE 参数。或者你可以直接在你的代码中#define UNICODE。 (我会删除#pragma once,它不是标题)
  • 嘿,非常感谢。我之前使用了#define UNICODE,但它没有用,所以我把它拿出来,但我尝试了-DUNICODE,它确实有效。非常感谢。
  • 你应该使用W的东西:PROCESSENTRY32W等等。如果在第一个 return 语句返回,这个函数也会泄漏资源。
  • 使用-municode开关(假设您使用的是mingw-w64),以及定义UNICODE它还链接正确版本的main等等

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


【解决方案1】:

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

/DMY_IDENTIFIER (cl) 的等价物在g++:

-DMY_IDENTIFER

在你的情况下意味着:-DUNICODE

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

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

【讨论】:

    【解决方案2】:

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

    这在 ye olde MinGW 上不可用,因此您需要一个 MinGW-w64 工具链。无论如何,您可能已经在使用它。如果不是这样,您可以从here 下载安装程序。

    【讨论】:

    • 你让我大开眼界,发现我真的错过了与编译器相关的东西。现在,我将始终查看我正在做的事情是否存在 -moption。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多