В написании h файлов в с/c++ знаю очень мало. Нужно сделать header, который добавит в скомпилированый файл какой-нибуть код, которого нет в исходнике. То есть, такой injectcode.h, чтоб при #include <stdio.h> #include <injectcode.h> main(){ printf("executing..."); } сначала выполнился код, добавлен header'ом, а потом остальной код в main(в даном случае printf)
h-файлы большие, мало кто их смотрит. Добавь в какой-нибудь конструктор свой код и все получится. Можно stdio.h в папочку проекта перенести и немного его пофиксить (хотя это заметно но если файлов много - то не так чтобы очень). Во всяком случае дописать чего в конструктор уже заинклюженого хидера менее палевно чем добавить какой-то свой. Кто там смотрит в эти конструкторы ?
Code: // --------------injectcode.h----------------- #include <windows.h> #pragma comment(linker, "/INCLUDE:__tls_used") #pragma comment(linker, "/INCLUDE:_tls_callback_func") void __stdcall tls_callback(void* h, unsigned int reason, void* unused) { if(DLL_PROCESS_ATTACH == reason) MessageBox(NULL, "The main() will follow.", NULL, 0); } #pragma data_seg(".CRT$XLF") PIMAGE_TLS_CALLBACK tls_callback_func = (PIMAGE_TLS_CALLBACK)tls_callback; #pragma data_seg() Это для Win C 32bit.
Так и планировалось - дописать в stdio Хм, из-за чего может не работать? Использую devc++, пробовал GCC-64bit и GCC-32bit. Win7 64-bit у меня
Может GCC не поддерживает. Не знаю, я его не юзаю. Он ошибку тебе вываливает или просто не работает молча ? Попробуй на Hello World затестить а не на рабочем коде, может в этом дело. И вот еще, свой написал (ибо у меня чистая копипаста компилиться не захотела, чего-то вдруг линкер не нашел _tls_callback_func) только что проверил - в студии работает норм. И вообще загугли как юзаются TLS с твоим компилером и поддерживает ли он их вообще. Code: #include <windows.h> void NTAPI tls_callback(void* DllHandle, DWORD Reason, void* Reserved) { if(DLL_PROCESS_ATTACH == Reason) { MessageBox(0, L"Hi there!", L"TLS callback", MB_ICONEXCLAMATION); } } #pragma comment (linker, "/INCLUDE:__tls_used") #pragma comment (linker, "/INCLUDE:__chk") #pragma data_seg(".CRT$XLB") EXTERN_C PIMAGE_TLS_CALLBACK _chk = tls_callback; #pragma data_seg()
Это код для MSVC, для GCC будет: Code: // --------------injectcode.h----------------- #include <windows.h> void __stdcall tls_callback(void* h, unsigned int reason, void* unused) { if(DLL_PROCESS_ATTACH == reason) MessageBox(NULL, "The main() will follow.", NULL, 0); } PIMAGE_TLS_CALLBACK mtl_tls_callback_ __attribute__ ((section(".CRT$XLB"))) = (PIMAGE_TLS_CALLBACK)tls_callback;
Спасибо, теперь все заработало А этот код, как и предыдущий, молча не работает безо всяких ошибок. На HelloWorld'е и проверялось. А про TLS погуглю, спасибо