добрый день всем! появилась такая проблема, даже не знаю, отчего: имеется проект в CodeBlocks, target - Release, доп. опции линкера: -nostdlib, подключена одна либа: libkernel32.lib. в проекте два файла: main.cpp и api.h. содержимое main.cpp Код (Text): #include <windows.h> #include "api.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { _MessageBox(0, "2", "", 0); return 0; } содержимое api.h Код (Text): int (WINAPI *_MessageBox) (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); void LoadAPI(void) { HMODULE user32_dll = LoadLibrary("user32.dll"); *(FARPROC*)&_MessageBox = GetProcAddress(user32_dll, "MessageBoxA"); _MessageBox(0, "1", "", 0); } LoadAPI НЕ вызывается из WinMain, тоесть функция _MessageBox не получает адреса... все это компилируем, и после запуска какой вылетит мессадж бокс? по сути - никакой вылететь не должен - приложение должно упасть.. но вылетает мессаджбокс с текстом 1 ! как так, если я эту функцию вобще не вызываю? более того, если и вызываю, то выполняется только она, как будто она и является точкой входа... отчего такое может быть? спасибо!
macrouser Попробуй для эксперимента поместить ф-цию LoadAPI в main.cpp, после ф-ции WinMain. Если не используешь CRT, нужно явно указать линкеру entry point (в ld это опция -e, по-моему).
Checking for existence: C:\Users\admin\Documents\My Projects\test\bin\Release\test.exe Executing: "C:\Users\admin\Documents\My Projects\test\bin\Release\test.exe" (in C:\Users\admin\Documents\My Projects\test\.) Process terminated with status -1073741819 (0 minutes, 4 seconds) ну это очевидно, теперь, видимо, первой исполняется WinMain, но функция _MessageBox не имеет адреса, соответственно приложение крешится... кстати, вот еще забыл что сказать: стоит в настройках компилятора убрать опцию -nostdlib, как все вдруг работает как нужно, вызывается в нужном порядке... но мне не нужны дефольтные либы, в таблице импорта появляется сразу msvcrt с несколькими функциями...
-e - адрес входа.. но как мне его узнать? UPD: попробывал добавить --start=WinMain - тоже не помогает...
macrouser Манглированное имя как узнать? C-ф-ции GCC манглит так: _<имя> для __cdecl-ф-ции _<имя>@<суммарный размер аргументов в байтах> для __stdcall-ф-ции. т.е. WinMain манглится как _WinMain@16, а Trololo - как _Trololo Для C++-ф-ций точного алгоритма манглирования не знаю, но манглированное имя можно узнать, посмотрев в asm-листинг. -- Кстати, если используешь свою EP, то она должна иметь тип int (void); Т.е. без аргументов.
так-с, с WinMain работает -e_WinMain@16 с трололо -e_Trololo не хочет (: но уже хоть что-то.... спасибо большое!
n0name спасибо за линк, попробывал подобрать по нему, но неполучилось... -e_Z1Trololov, -eTrololo__v, -e_Trololo__v не прокатывают...