一、操作系统
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:如何显示窗口