【问题标题】:How do I pass a string to a DLL using the Win32 API?如何使用 Win32 API 将字符串传递给 DLL?
【发布时间】:2011-08-17 07:43:49
【问题描述】:

我正在尝试将一个字符串(或 char*)从 Rundll32 传递到使用此源构建(使用 MinGW)的 DLL:

#include <windows.h>

__declspec( dllexport ) int hello(LPSTR content) {

  MessageBox( NULL, content, "Message", MB_OK );
  return 0;

}

运行此程序时,我会随机崩溃。这就是我运行它的方式。

C:\workspace>c:\MinGW\bin\gdb.exe rundll32 -ex "run program1.dll,hello test"

我尝试在 hello() 处设置断点,似乎“内容”非常随机。我是否以错误的方式从 rundll32 传递参数?

如果我没有参数,它可以正常工作。

【问题讨论】:

    标签: c winapi mingw rundll32


    【解决方案1】:

    rundll32 入口点需要以非常具体的方式声明。查看this article,它解释了该怎么做。我注意到的一件事是,对于名为“EntryPoint”的符号,传递给 rundll32 的函数名称对于 32 位 DLL 应该是“_EntryPoint@16”,对于 64 位 DLL 应该是“EntryPoint”。

    【讨论】:

    • 是的,我之前尝试过。不过似乎不起作用。我正在使用这个函数定义:“void CALLBACK hello(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);”。当我调用 rundll32.exe 时,我收到一个带有“缺少条目:_hello@16”的消息框。我在 32 位 x86 / Windows 7 上。我读到有一个名为“depends.exe”的工具可以列出入口点,但我只能在 WinXP 上找到它。也许 objdump 可以做同样的事情?
    • Dependency Walker 在 Windows 7 上运行良好。
    • 好的,使用 Dependency Walker 我发现入口点被命名为“hello@16”(没有下划线)。现在工作:)
    • 不要忘记,rundll32 100% 未记录,如有更改,Microsoft 恕不另行通知。
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多