Как «использовать набор символов Unicode» в G ++? - PullRequest
4 голосов
/ 19 мая 2019

Я работаю над программой на C ++, где я пытаюсь использовать функцию WriteProcessMemory () в Windows. для этого мне нужна функция, которая получает идентификатор целевого процесса. я могу сделать это, используя следующую функцию:

#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;
}

Я могу компилировать с использованием Visual Studio, если я установил набор символов в Unicode, но когда я пытаюсь использовать 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.

есть ли возможность принудительно использовать юникод в g ++, как в cl?

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Правильный ответ здесь - использовать переключатель компилятора -municode, который определяет все, что вам нужно, и ссылки на правильные файлы CRT, чтобы предоставить вам правильное определение _wmain.

Это недоступно на старом MinGW, поэтому для этого вам понадобится набор инструментов MinGW-w64. Скорее всего, вы уже используете это в любом случае. Если это не так, вы можете скачать установщик с здесь .

1 голос
/ 20 мая 2019

cl (компилятор Microsoft C / C ++) и g++ (компилятор Gnu C ++) имеют очень близкий синтаксис аргументов для определенного параметра.Дельта больше обычной разницы Dos / Shell (слэш против тире).

Эквивалент /DMY_IDENTIFIER (cl) находится на g++:

-DMY_IDENTIFER

, которыйв вашем случае означает: -DUNICODE

Полная командная строка компиляции должна выглядеть следующим образом:

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