我正在编写一个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中进行编译:
cl /EHsc /D UNICODE write.cpp
这里的/D UNICODE
与在Visual Studio中打开项目属性,将Character Set
设置为Use Unicode Character Set
相同。
是否有一种像cl那样强制使用g ++中的unicode的选项?
-DUNICODE
参数。或者你可以在代码中直接使用#define UNICODE
。(此外我会移除#pragma once
,它不是头文件) - Sandburg#define UNICODE
,但它没有起作用,所以我将其删除了,但是我尝试了-DUNICODE
,它确实起作用了。非常感谢。 - jumpindonutsW
相关的东西:PROCESSENTRY32W
等等。此外,如果在第一个返回语句处返回,此函数可能会泄漏资源。 - user7860670