Запуск DLL через RunDLL32.exe

Тема в разделе "WASM.BEGINNERS", создана пользователем mix_mix, 8 окт 2005.

  1. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Всем привет!

    На днях читал статьи Delphi World и увидел, что можно запускать свои дин. библеотеки через RunDll32.exe. Вот часть статьи:

    ....

    Вы должны определить в программе вызываемую снаружи функцию.



    Функция должна быть __stdcall (или WINAPI, что то же самое ;)) и иметь четыре аргумента. Первый - HWND окна, порождаемого rundll32 (можно использовать в качестве owner'а своих dialog box'ов), второй - HINSTANCE задачи, третий - остаток командной строки (LPCSTR, даже под NT), четвертый - не знаю ;).



    Hапример -



    Код (Text):
    1. int __stdcall __declspec(dllexport) Test
    2. (
    3. HWND hWnd,
    4. HINSTANCE hInstance,
    5. LPCSTR lpCmdLine,
    6. DWORD dummy
    7. )
    8. {
    9. MessageBox(hWnd, lpCmdLine, "Command Line", MB_OK);
    10. return 0;
    11. }


    Исполняем таким образом -

    rundll32 test.dll,_Test@16 this is a command line

    выдаст message box со строкой "this is a command line".


    ...

    Все бы хорохо, но под masm если создаешь несколько подобных функций, исполняется только первая, точнее та, что следует за меткой 'start:'.

    Интересно, что за фигня???
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    mix_mix

    Покажи код, который в твоей dll'ке следует за меткой 'start:'.
     
  3. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    .data



    mes1 db "first function",0

    mes2 db "second function",0



    .code

    start:



    first PROC EXPORT hWnd: DWORD, hInstanse: DWORD, lpCmsLine: LPCSTR, dummy: DWORD

    invoke MessageBoxA, 0, offset mes1, offset mes1, MB_OK

    invoke ExitProcess, 0

    first ENDP



    second PROC EXPORT hWnd: DWORD, hInstanse: DWORD, lpCmsLine: LPCSTR, dummy: DWORD

    invoke MessageBoxA, 0, offset mes2, offset mes2, MB_OK

    invoke ExitProcess, 0

    second ENDP



    end start



    Далее:

    ml /c /coff /DMASM temp.asm

    link /subsystem:windows /DLL temp.obj



    Смотрю на библ. через eXeScope: две экспорт. функции _first@16 и _second@16. Запускаю через rundll:

    rundll32.exe C:\masm32\bin\temp.dll,_first@16 -- Появляется окошко с надписью "first function",

    rundll32.exe C:\masm32\bin\temp.dll,_second@16 -- То же самое окошко с надписью "first function".

    Кстати если после метки 'start:' идет инструкция jmp second, то в обоих случаях надпись в окошке "second function".
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    mix_mix

    Imho ты понятия не имеешь о структуре dll'ек.

    Что-нибудь слышал о DllMain/LibMain?

    Зачем в экспортируемых функциях ExitProcess?
     
  5. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Честно говоря ты прав. Я читал насчет "процедуры входа", но толком не понял. Может объяснишь?