如何使用rundll32.exe创建可从批处理调用的DLL

时间:2016-08-17 00:01:29

标签: winapi dll

使用rundll32可以将简单的API调用到DLL中。

两个问题:

  • 对于这种用法,应该是入口点使用__cdecl调用约定还是其他一些调用约定?
  • 是否可以只传递数字参数或字符串?

2 个答案:

答案 0 :(得分:3)

请勿使用 rundll32.exe 。我不能比Raymond Chen更好地说出来:What’s the guidance on when to use rundll32? Easy: Don’t use it

如果您仔细阅读博客条目,并且仍然确信这是您需要的解决方案,那么deal:入口点必须遵循__stdcall调用约定:

void CALLBACK
EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow);

尾随W很重要,因此 lpszCmdLine 参数将作为Unicode(UTF-16LE)传递。 EntryPoint 是占位符,可以是任何合法符号。

例如,您可以导出名为MyFunctionW的符号,并使用以下命令传递任意命令行:

rundll32.exe MyDll.dll,MyFunction 132 C:\WINDOWS\INF\SHELL.INF

但实际上,您应该评估其他选项(例如PowerShell)。便利不是免费的。

答案 1 :(得分:2)

入口点必须使用__stdcall调用约定:

  void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);

以下文档对此进行了介绍:

NFO: Windows Rundll and Rundll32 Interface