Всем привет! На днях читал статьи Delphi World и увидел, что можно запускать свои дин. библеотеки через RunDll32.exe. Вот часть статьи: .... Вы должны определить в программе вызываемую снаружи функцию. Функция должна быть __stdcall (или WINAPI, что то же самое ) и иметь четыре аргумента. Первый - HWND окна, порождаемого rundll32 (можно использовать в качестве owner'а своих dialog box'ов), второй - HINSTANCE задачи, третий - остаток командной строки (LPCSTR, даже под NT), четвертый - не знаю . Hапример - Код (Text): int __stdcall __declspec(dllexport) Test ( HWND hWnd, HINSTANCE hInstance, LPCSTR lpCmdLine, DWORD dummy ) { MessageBox(hWnd, lpCmdLine, "Command Line", MB_OK); return 0; } Исполняем таким образом - rundll32 test.dll,_Test@16 this is a command line выдаст message box со строкой "this is a command line". ... Все бы хорохо, но под masm если создаешь несколько подобных функций, исполняется только первая, точнее та, что следует за меткой 'start:'. Интересно, что за фигня???
.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".
mix_mix Imho ты понятия не имеешь о структуре dll'ек. Что-нибудь слышал о DllMain/LibMain? Зачем в экспортируемых функциях ExitProcess?