Это с компилятором, который поставляется с Dev-C ++ при работе в Windows 7, «TDM-GCC 4.9.2 64-bit Release». То же самое происходит и с 64-битной версией. Параметр «добавить следующие флаги при вызове компоновщика» в «Параметры компилятора» имеет значение -static-libgcc -lws2_32
и «добавить следующие флаги при вызове компилятора» std=c++11
,
К сожалению, я не могу получить гораздо больше информации, чем это, потому что это очень, очень заблокированный компьютер.
Как только я вернусь домой, я проверю это там и отредактирую любую новую информацию.
Тестовый файл:
#include <windows.h>
#include <psapi.h>
#include <iostream>
int main() {
HANDLE h = GetCurrentProcess();
TCHAR name[100];
GetProcessImageFileName(h, name, 100);
std::cout << "Name is " << std::endl;
}
При компиляции выдает следующую ошибку:
C:\Users\[REDACTED]\AppData\Local\Temp\ccQz3L9P.o:test.cpp:(.text+0x2f): undefined reference to `GetProcessImageFileNameA'
Насколько я могу судить, это звонит GetProcessImageFileNameA
вместо GetProcessImageFileName
из-за #define
в psapi.h
:
#define GetProcessImageFileName __MINGW_NAME_AW(GetProcessImageFileName)
__MINGW_NAME_AW(func)
является #define
д в _mingw_unicode.h
как func##A
что, если я правильно понимаю, откуда исходит имя нового метода.
Вернуться в psapi.h
, DWORD WINAPI GetProcessImageFileNameA(HANDLE, LPSTR, DWORD);
объявлен, но я нигде не нашел его определения, и Dev-C ++ тоже не может. Я вполне уверен, что это проблема.
Как я могу это исправить? Я открыт для всего, вплоть до переключения компиляторов или IDE, до тех пор, пока я могу поместить все, что я использую, на флэш-диск и носить его с как можно меньшим раздражением, и что конечный результат не требует администрирования привилегии для запуска.
GetProcessImageFileName
является функцией Windows API, и вам нужно связаться с нужной библиотекой, чтобы получить к ней доступ.
Он определяется как макрос GetProcessImageFileNameA
или же GetProcessImageFileNameW
в зависимости от того, компилируете ли вы «широкий» или «узкий».
Win32 API имеет Unicode и ascii версии каждой функции (по крайней мере, функции, которые принимают строки). В общем, версия ascii преобразует символы в Unicode и вызывает другую имплантацию внутренне.
вам нужно ссылку Psapi.lib
или же Kernel32.lib
в ваш проект. Я не уверен насчет вашего компилятора, но в VC ++ вы добавляете #pragma comment(lib, "Psapi.Lib")
в свой код или добавить Psapi.lib
в дополнительных библиотеках свойств проекта.
Сэм