Как написать DLL, которую можно было-бы выполнить с помощью RunDll, RunDll32?

Материал из DRKB

Как написать DLL, которую можно было-бы выполнить с помощью RunDll, RunDll32?[править | править код]

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

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

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".

Oleg Moroz 
(2:5020/701.22) 


function Test(
  hWnd: Integer;
  hInstance: Integer;
  lpCmdLine: PChar;
  dummy: Longint
  ): Integer; stdcall; export;
begin
  Windows.MessageBox(hWnd, lpCmdLine, 'Command Line', MB_OK);
  Result := 0;
end;


Akzhan Abdulin 
(2:5040/55) 


Давненько я ждал эту информацию! Сел проверять и наткнулся на очень забавную вещь. А именно -- пусть у нас есть исходник на Си примерно такого вида:

int WINAPI RunDll( HWND hWnd, HINSTANCE hInstance, LPCSTR lpszCmdLine, DWORD dummy ) 
int WINAPI RunDllW( HWND hWnd, HINSTANCE hInstance, LPCWSTR lpszCmdLine, DWORD dummy ) 

и .def-файл примерно такого вида:


EXPORTS 
    RunDll 
    RunDllA=RunDll 
    RunDllW 

то rundll32 становится разборчивой -- под НТ вызывает UNICODE-версию. Под 95, разумеется, ANSI. Rulez.

Alexey A Popoff 
pvax@glas.apc.org, posp@ccas.ru 
http://www.ccas.ru/~posp/popov/pvax.html 
(2:5020/487.26)Администрирование 


ID: 01992