Акжан в сети - На уровень вверх(W32) Как написать 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


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

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

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

EXPORTS
  RunDll
  RunDllA=RunDll
  RunDllW

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

Классно!

Alexey A Popoff

pvax@glas.apc.org, posp@ccas.ru

http://www.ccas.ru/~posp/popov/pvax.html

(2:5020/487.26)