0

我正在尝试编写一个 exe,它还导出可以用 rundll32 调用的函数。这可能吗?如果可以,为什么它不能像这样工作?

我密切关注微软对此的建议

#define RUNDLL32(func) extern "C" __declspec(dllexport) void CALLBACK func(HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow)

RUNDLL32(MyFunc)
{
  MessageBox(0, 0, 0, 0);
}

但是当被调用时

rundll32 myprog.exe,_MyFunc@16

rundll32 崩溃/DEP 启动。

4

1 回答 1

2

Rundll32.exe 使用 LoadLibrary() 加载可执行映像。这不太可能对 EXE 有效,它不会期望加载到不是其默认地址的地址上。保证会发生,rundll32.exe 已经占用了该默认地址。不确定您是否可以修改链接器,以便它不会忽略重定位记录。

但是不要打扰这种方法,只需创建一个 DLL 而不是 EXE。并将真正的参数传递给 MessageBox()。而且,是的,使用 .def 文件重命名导出的函数。

于 2010-11-04T13:28:43.403 回答