RUNDLL32简述

一、操作系统
  Windows 95/98/ME提供rundll.exe和rundll32.exe,前者用来处理16位的DLL,后者用来处理32位的DLL,而NT/2000/XP/2003则只提供rundll32.exe。除此之外,两个程序的行为没什么不同。

二、命令行格式
  RUNDLL32.EXE <DLL名>,<函数名> <可选的参数>
  例如:RUNDLL32.EXE MyDll.DLL,TheFunction Hello World
  则RUNDLL32会装载名为MyDLL.DLL的动态链接库,并调用动态链接库中的函数TheFunction,向它传递参数'Hello World'

三、注意事项
  1、如果没有指名DLL的路径全名,那么RUNDLL32按以下顺序搜索DLL:
    a、RUNDLL32所在的目录
    b、当前目录
    c、系统目录(98通常为WINDOWS安装目录下面的SYSTEM目录、NT和2000通常为WINDOWS安装目录下面的SYSTEM32目录)
    d、如果是NT和2000系统,搜索16位系统目录,即WINDOWS安装目录下面的SYSTEM目录
    e、WINDOWS安装目录
    f、PATH环境变量中指明的搜索路径
  2、建议使用DLL的全路径名,但推荐用短文件名,因为RUNDLL32无法识别路径全名中包含的空格。
  3、DLL文件名中不能包含空格、逗号和引号。
  4、DLL名和函数名之间必须有一个逗号(,),且逗号前后不能有空格。

四、RUNDLL32如何工作
  RUNDLL32按以下步骤工作:
  1、分析命令行
  2、用LoadLibrary()这个API来装载DLL
  3、用GetProcAddress()这个API来找到函数入口点
  4、调用函数,把<可选参数>做为命令行传递给函数
  5. 函数返回后,用FreeLibrary()来卸掉DLL
  6、结束RUNDLL32程序的运行

五、如何编写DLL中的函数
  DLL中的函数应该这样写(不考虑16位DLL):

  C语言: void CALLBACK TheFunction(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
  PASCAL:procedure TheFunction(AWnd, AInst: THandle; ACmdLine: PChar; ACmdShow: Integer); stdcall;

  请注意:函数的调用约定必须是stdcall,否则RUNDLL32可能会出错。

六、示例

  RUNDLL32.EXE MyDll.DLL,TheFunction Hello World
  则TheFunction收到的参数如下:
   AWnd:    父窗口句柄
   AInst:   MyDLL.DLL的句柄 
   ACmdLine:字符串(以零结尾)'Hello World'
   ACmdShow:如何显示窗口

七、UNICODE系统
   从NT开始的WINDOWS都是基于UNICODE的,因为,在这样的环境下,RUNDLL32首先尝试在函数名后面加个W,如果没找到这个函数,就尝 试在函数名后面加A,如果还没有找到,再用提供的函数名。如果添加W字符后找到函数,则lpszCmdLine传递的是宽字符串。

你可能感兴趣的:(windows,Integer,System,dll,callback,pascal)