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

我密切关注Microsoft's advice on this

#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启动。

最佳答案

Rundll32.exe使用LoadLibrary()加载可执行镜像。这对于EXE来说不太可能很好解决,它不希望加载到不是默认地址的地址上。保证会发生这种情况,rundll32.exe已经占用了该默认地址。不知道是否可以修改链接器,以便它不会忽略重定位记录。

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

关于winapi - 如何实现rundll2-callable函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4096013/

10-11 23:02