Dll и потоки...

Тема в разделе "WASM.WIN32", создана пользователем perdimonokl, 23 янв 2008.

  1. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Народ ничего не пойму. Скиньте на С или С++ рабочий сорец дллки которая создаёт поток, а поток вызывает мессагбокс. У меня нифига не выходит. Занкомый на асме накодил дллку говорит всё пашет я взял у него подгружаю и не пашет. Помогите :dntknw:
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    нет уточнения - внутри DllEntryPoint или нет? =))
     
  3. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Great Короче дело такое. Я писал дллку кое где не работает как надо, мне знакомый говорит создай поток, а я не знаю можно или нет так делать из под дллки потки создавать. Короче написал просто ради интереса код:
    Код (Text):
    1. #include <windows.h>
    2.  
    3. DWORD WINAPI StartThread(LPVOID lpParam)
    4. {
    5.     MessageBox(NULL,"MESSAGE","OK",MB_OK);
    6.     return 0;
    7. }
    8.  
    9. VOID WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
    10. {
    11.     switch(fdwReason)
    12.         {
    13.     case DLL_PROCESS_ATTACH:
    14.         CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&StartThread,NULL,0,NULL);
    15.         break;
    16.     case DLL_PROCESS_DETACH:   
    17.         ExitProcess(TRUE);
    18.         break;
    19.     }
    20. }
    Знакомому кидаю не пашет, он говрит точно должно работать. Ну он написал на асме говорит у меня всё пашет. Тупизм какой то.

    Просвятите меня можно так делать или нет. Из под дллки создавать потоки можно?
     
  4. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    можно создавать потоки :) должно работать, попробуй sleep воткнуть после создания потока.
     
  5. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Hellspawn Да я и sleep втыкал и WaitForSingleObject и всё равно не пашет. Подгружаю дллку через LoadLibrary и болт ни мессагбокса ничего вообще.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    load.asm
    Код (Text):
    1. include 'win32ax.inc'
    2. .code
    3. start:
    4.         invoke LoadLibrary, "dllko.dll"
    5.         retn
    6. .end start
    dllko.asm
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3. include 'win32a.inc'
    4.  
    5. section '.data' data readable writable
    6. thID dd 0
    7. helo db 'Hello, World!',0
    8. bThreadCreated db 0
    9.  
    10. section '.code' code readable executable
    11. proc Thread arg
    12.         invoke  MessageBox, 0, helo, 0, 0
    13.         ret
    14. endp
    15.  
    16. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    17.         cmp     [bThreadCreated], 0
    18.         jnz @F
    19.  
    20.         inc byte [bThreadCreated]
    21.         invoke  CreateThread, 0, 0, Thread, 0, 0, thID
    22.  
    23.    @@:  mov     eax,TRUE
    24.         ret
    25. endp
    26.  
    27.  
    28. section '.idata' import data readable writeable
    29.   library kernel,'KERNEL32.DLL', user,'USER32.DLL'
    30.   import kernel, CreateThread, 'CreateThread'
    31.   import user, MessageBox,'MessageBoxA'
    32.  
    33. section '.reloc' fixups data discardable
    Чудесно все работает
     
  7. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Great ну это на асме а на С++ можно? Почему у меня кодес то мой не работает тот что я положил?
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Последний параметр не опциональный,
    lpThreadId
    Points to a 32-bit variable that receives the thread identifier.
    Используй GetLastError()
     
  9. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Clerk Да причём тут последний параметр это идентификатор потока хочешь задавай не хочешь не задвай. Я по всякому пробовал на С++ писать никак не выходит
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    отладчик не судьба юзать?
    тем более в си.
     
  11. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Вот с GetLastError(). Выдаёт что операция успешно завершена

    Код (Text):
    1. #include <windows.h>
    2.  
    3. DWORD WINAPI StartThread(LPVOID lpParam)
    4. {
    5.     MessageBox(HWND(0),"MESSAGE","OK",MB_OK);
    6.     return 0;
    7. }
    8.  
    9. VOID WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
    10. {
    11.     char errMessage[1024] = {0};
    12.     HANDLE hThread;
    13.  
    14.     switch(fdwReason)
    15.     {
    16.     case DLL_PROCESS_ATTACH:
    17.         hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&StartThread,NULL,0,NULL);
    18.         if(hThread)
    19.         {
    20.             FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, errMessage, sizeof(errMessage)-1, 0);
    21.             MessageBox(HWND(0), errMessage, 0, MB_ICONERROR);
    22.         }
    23.         break;
    24.     case DLL_PROCESS_DETACH:   
    25.         ExitProcess(TRUE);
    26.         break;
    27.     }
    28. }
    То есть поток создаётся но MessageBox который в должен выскачить из функции StartThread его просто нет. Я уже и не знаю в чём прикол даже. Попробуйте напишите на С++ кто то может я не так делаю проект или ещё что :dntknw:

    To Great Скомпилил всё что ты давал. Работает, но на асме я писать не умею :)
     
  12. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    MSDN DllMain


    return TRUE;
     
  13. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    W4FhLF я не понял смысла сколько не вчитывался. Исправь сорец я не понимаю каким боком мне return TRUE; чтото изменит
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    perdimonokl
    ну ты попробуй поставить то. и попробуй передать нормальный последний параметр CreateThread.
     
  15. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    и DllMain объявить как
    BOOL WINAPI DllEntryPoint(

    HINSTANCE hinstDLL, // handle to DLL module
    DWORD fdwReason, // reason for calling function
    LPVOID lpvReserved // reserved
    );
     
  16. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Код (Text):
    1. #include <windows.h>
    2.  
    3. DWORD WINAPI StartThread(LPVOID lpParam)
    4. {
    5.     MessageBox(0,"MESSAGE","OK",MB_OK);
    6.     return 0;
    7. }
    8.  
    9. BOOL WINAPI DllMain(
    10.     HINSTANCE hinstDLL,  // handle to DLL module
    11.     DWORD fdwReason,     // reason for calling function
    12.     LPVOID lpReserved )  // reserved
    13. {
    14.     char errMessage[1024] = {0};
    15.     HANDLE hThread;
    16.     DWORD ThID;
    17.     // Perform actions based on the reason for calling.
    18.     switch( fdwReason )
    19.     {
    20.         case DLL_PROCESS_ATTACH:
    21.          // Initialize once for each new process.
    22.          // Return FALSE to fail DLL load.
    23.             hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartThread,NULL,0,&ThID);
    24.             break;
    25.  
    26.         case DLL_THREAD_ATTACH:
    27.          // Do thread-specific initialization.
    28.             break;
    29.  
    30.         case DLL_THREAD_DETACH:
    31.          // Do thread-specific cleanup.
    32.             break;
    33.  
    34.         case DLL_PROCESS_DETACH:
    35.          // Perform any necessary cleanup.
    36.             break;
    37.     }
    38.     return TRUE;  // Successful DLL_PROCESS_ATTACH.
    39. }
    Loader:

    Код (Text):
    1. int main(int argc, char* argv[])
    2. {
    3.     HMODULE hModule = LoadLibrary(argv[1]);
    4.     Sleep(INFINITE);
    5.     return 0;
    6. }
     
  17. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Вот здесь:

    http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx

    неплохой документ от Microsoft где написано чего нельзя делать в DllMain(). Одно из требований - не создавать потоков. Экспортируй функцию и там можно создавать что угодно.
     
  18. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Создавать потоки можно, но стартовать они будут только после возврата из dllmain! У кого есть возможность, посмотрите исходники винды - перед передачей управления на dllmain создается крит. секция. Она же создается и перед созданием треда. (надеюсь, про секции не наврал :) - а остальгное точно правда)
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Хм.. интеренсо, Надо глянуть.
     
  20. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Блин а всего то надо было воткнуть Sleep() после загрузки дллки. Пипец я бы не допёр :) А я и return TRUE; ставил и так мутил и сяк. Мда спасибки. Вот что получилось.

    Дллка:
    Код (Text):
    1. #include <windows.h>
    2.  
    3. DWORD WINAPI StartThread(LPVOID lpParam)
    4. {
    5.     MessageBox(HWND(0),"MESSAGE","OK",MB_OK);
    6.     HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,FALSE,"messEvent");
    7.     if (hEvent)
    8.     {
    9.       BOOL ret=SetEvent(hEvent);
    10.       CloseHandle(hEvent);
    11.     }
    12.     return 0;
    13. }
    14.  
    15. BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
    16. {
    17.     char errMessage[1024] = {0};
    18.     HANDLE hThread;
    19.  
    20.     switch(fdwReason)
    21.     {
    22.     case DLL_PROCESS_ATTACH:
    23.         hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&StartThread,NULL,0,NULL);
    24.         break;
    25.     case DLL_PROCESS_DETACH:   
    26.         ExitProcess(TRUE);
    27.         break;
    28.     }
    29.  
    30.     return TRUE;
    31. }
    Загрузчик дллки :)
    Код (Text):
    1. #include <windows.h>
    2.  
    3. int main(int argc, char* argv[])
    4. {
    5.     HMODULE hModule = LoadLibrary(argv[1]);
    6.     HANDLE hEvent=CreateEvent(NULL,FALSE,FALSE,"messEvent");
    7.     DWORD ret=WaitForSingleObject(hEvent,INFINITE);
    8.     return 0;
    9. }