Народ ничего не пойму. Скиньте на С или С++ рабочий сорец дллки которая создаёт поток, а поток вызывает мессагбокс. У меня нифига не выходит. Занкомый на асме накодил дллку говорит всё пашет я взял у него подгружаю и не пашет. Помогите
Great Короче дело такое. Я писал дллку кое где не работает как надо, мне знакомый говорит создай поток, а я не знаю можно или нет так делать из под дллки потки создавать. Короче написал просто ради интереса код: Код (Text): #include <windows.h> DWORD WINAPI StartThread(LPVOID lpParam) { MessageBox(NULL,"MESSAGE","OK",MB_OK); return 0; } VOID WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { switch(fdwReason) { case DLL_PROCESS_ATTACH: CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&StartThread,NULL,0,NULL); break; case DLL_PROCESS_DETACH: ExitProcess(TRUE); break; } } Знакомому кидаю не пашет, он говрит точно должно работать. Ну он написал на асме говорит у меня всё пашет. Тупизм какой то. Просвятите меня можно так делать или нет. Из под дллки создавать потоки можно?
Hellspawn Да я и sleep втыкал и WaitForSingleObject и всё равно не пашет. Подгружаю дллку через LoadLibrary и болт ни мессагбокса ничего вообще.
load.asm Код (Text): include 'win32ax.inc' .code start: invoke LoadLibrary, "dllko.dll" retn .end start dllko.asm Код (Text): format PE GUI 4.0 DLL entry DllEntryPoint include 'win32a.inc' section '.data' data readable writable thID dd 0 helo db 'Hello, World!',0 bThreadCreated db 0 section '.code' code readable executable proc Thread arg invoke MessageBox, 0, helo, 0, 0 ret endp proc DllEntryPoint hinstDLL,fdwReason,lpvReserved cmp [bThreadCreated], 0 jnz @F inc byte [bThreadCreated] invoke CreateThread, 0, 0, Thread, 0, 0, thID @@: mov eax,TRUE ret endp section '.idata' import data readable writeable library kernel,'KERNEL32.DLL', user,'USER32.DLL' import kernel, CreateThread, 'CreateThread' import user, MessageBox,'MessageBoxA' section '.reloc' fixups data discardable Чудесно все работает
Последний параметр не опциональный, lpThreadId Points to a 32-bit variable that receives the thread identifier. Используй GetLastError()
Clerk Да причём тут последний параметр это идентификатор потока хочешь задавай не хочешь не задвай. Я по всякому пробовал на С++ писать никак не выходит
Вот с GetLastError(). Выдаёт что операция успешно завершена Код (Text): #include <windows.h> DWORD WINAPI StartThread(LPVOID lpParam) { MessageBox(HWND(0),"MESSAGE","OK",MB_OK); return 0; } VOID WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { char errMessage[1024] = {0}; HANDLE hThread; switch(fdwReason) { case DLL_PROCESS_ATTACH: hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&StartThread,NULL,0,NULL); if(hThread) { FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, errMessage, sizeof(errMessage)-1, 0); MessageBox(HWND(0), errMessage, 0, MB_ICONERROR); } break; case DLL_PROCESS_DETACH: ExitProcess(TRUE); break; } } То есть поток создаётся но MessageBox который в должен выскачить из функции StartThread его просто нет. Я уже и не знаю в чём прикол даже. Попробуйте напишите на С++ кто то может я не так делаю проект или ещё что To Great Скомпилил всё что ты давал. Работает, но на асме я писать не умею
W4FhLF я не понял смысла сколько не вчитывался. Исправь сорец я не понимаю каким боком мне return TRUE; чтото изменит
perdimonokl ну ты попробуй поставить то. и попробуй передать нормальный последний параметр CreateThread.
и DllMain объявить как BOOL WINAPI DllEntryPoint( HINSTANCE hinstDLL, // handle to DLL module DWORD fdwReason, // reason for calling function LPVOID lpvReserved // reserved );
Код (Text): #include <windows.h> DWORD WINAPI StartThread(LPVOID lpParam) { MessageBox(0,"MESSAGE","OK",MB_OK); return 0; } BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to DLL module DWORD fdwReason, // reason for calling function LPVOID lpReserved ) // reserved { char errMessage[1024] = {0}; HANDLE hThread; DWORD ThID; // Perform actions based on the reason for calling. switch( fdwReason ) { case DLL_PROCESS_ATTACH: // Initialize once for each new process. // Return FALSE to fail DLL load. hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartThread,NULL,0,&ThID); break; case DLL_THREAD_ATTACH: // Do thread-specific initialization. break; case DLL_THREAD_DETACH: // Do thread-specific cleanup. break; case DLL_PROCESS_DETACH: // Perform any necessary cleanup. break; } return TRUE; // Successful DLL_PROCESS_ATTACH. } Loader: Код (Text): int main(int argc, char* argv[]) { HMODULE hModule = LoadLibrary(argv[1]); Sleep(INFINITE); return 0; }
Вот здесь: http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx неплохой документ от Microsoft где написано чего нельзя делать в DllMain(). Одно из требований - не создавать потоков. Экспортируй функцию и там можно создавать что угодно.
Создавать потоки можно, но стартовать они будут только после возврата из dllmain! У кого есть возможность, посмотрите исходники винды - перед передачей управления на dllmain создается крит. секция. Она же создается и перед созданием треда. (надеюсь, про секции не наврал - а остальгное точно правда)
Блин а всего то надо было воткнуть Sleep() после загрузки дллки. Пипец я бы не допёр А я и return TRUE; ставил и так мутил и сяк. Мда спасибки. Вот что получилось. Дллка: Код (Text): #include <windows.h> DWORD WINAPI StartThread(LPVOID lpParam) { MessageBox(HWND(0),"MESSAGE","OK",MB_OK); HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,FALSE,"messEvent"); if (hEvent) { BOOL ret=SetEvent(hEvent); CloseHandle(hEvent); } return 0; } BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { char errMessage[1024] = {0}; HANDLE hThread; switch(fdwReason) { case DLL_PROCESS_ATTACH: hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&StartThread,NULL,0,NULL); break; case DLL_PROCESS_DETACH: ExitProcess(TRUE); break; } return TRUE; } Загрузчик дллки Код (Text): #include <windows.h> int main(int argc, char* argv[]) { HMODULE hModule = LoadLibrary(argv[1]); HANDLE hEvent=CreateEvent(NULL,FALSE,FALSE,"messEvent"); DWORD ret=WaitForSingleObject(hEvent,INFINITE); return 0; }