Rundll32.exe参数传递问题解决方法

 
#include <afxwin.h>   
  1.   
  2. extern "C" __declspec(dllexportvoid F1(int num)  
  3. {  
  4.     CString str;  
  5.     str.Format("%d",num);  
  6.     AfxMessageBox(str);  
  7. }  

本人曾经碰到一个问题,就是按照网上搜索到的说明,Rundll32的用法为:

rundll32 DllName,FunctionName [Arguments]

假设以上DLL编译好后得到L_test1.dll,于是,我在命令行下输入:rundll32 L_test1.dll,F1 888

可是,结果却不是我所期望的弹出一个显示内容为888对话框。这是为什么呢?

 

后来本人又试了很久,还认为网上所说的格式是错误的,于是还试了很多种自己乱想的格式,就像破解密码一样,但依然失败,晕!

最后,我想到了MSDN,于是就有了这一篇译文:http://blog.csdn.net/leng_que/archive/2009/10/07/4639073.aspx

 

 

#include <afxwin.h>   
  1.   
  2. extern "C" __declspec(dllexport)   
  3. void F2(  
  4.         HWND hwnd,        // handle to owner window   
  5.         HINSTANCE hinst,  // instance handle for the DLL   
  6.         LPTSTR lpCmdLine, // string the DLL will parse   
  7.         int nCmdShow      // show state   
  8.         )  
  9. {  
  10.     if ( strlen(lpCmdLine) != 0 )  
  11.     {  
  12.         CString num;  
  13.         num = lpCmdLine;  
  14.         AfxMessageBox(num);  
  15.     }  
  16.     else  
  17.     {  
  18.         AfxMessageBox("lpCmdLine is NULL");  
  19.     }  
  20. }  

看了MSDN上的说明,我终于明白了原因,原来导出函数的原型是有要求的,要像上面这样写的DLL才行,假设这个DLL名为L_test2.dll。

 

运行命令:rundll32 L_test2.dll,F2 888

OK!终于成功了!

 

最后还有一点值得一提,我并没有完全按照MSDN上的那样把导出函数的调用方式声明为CALLBACK方式,因为我发现如果完全按照MSDN上的那种函数导出格式是会失败的!

你可能感兴趣的:(Rundll32.exe参数传递问题解决方法)