如何在 g++ 中 "use unicode character set"?
how to "use unicode character set" in g++?
我正在用 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 的选项?
cl
(Microsoft C/C++ 编译器)和 g++
(Gnu C++ 编译器)在某些参数上有非常接近的参数语法。增量更多的是 Dos / Shell(斜线与破折号)的通常差异。
等同于 /DMY_IDENTIFIER
(cl
) 在 g++
:
-DMY_IDENTIFER
这意味着你的情况:-DUNICODE
完整的编译命令行必须如下所示:
g++ -DUNICODE -std=c++17 write.cpp
此处的正确答案是使用编译器开关 -municode
,它定义了您需要的一切,并链接到正确的 CRT 文件,以便为您提供 _wmain
的正确定义。
这在旧的 MinGW 上不可用,因此您需要一个 MinGW-w64 工具链。很可能你已经在使用它了。如果不是这种情况,您可以从 here.
下载安装程序
我正在用 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 的选项?
cl
(Microsoft C/C++ 编译器)和 g++
(Gnu C++ 编译器)在某些参数上有非常接近的参数语法。增量更多的是 Dos / Shell(斜线与破折号)的通常差异。
等同于 /DMY_IDENTIFIER
(cl
) 在 g++
:
-DMY_IDENTIFER
这意味着你的情况:-DUNICODE
完整的编译命令行必须如下所示:
g++ -DUNICODE -std=c++17 write.cpp
此处的正确答案是使用编译器开关 -municode
,它定义了您需要的一切,并链接到正确的 CRT 文件,以便为您提供 _wmain
的正确定义。
这在旧的 MinGW 上不可用,因此您需要一个 MinGW-w64 工具链。很可能你已经在使用它了。如果不是这种情况,您可以从 here.
下载安装程序