2010-11-04 42 views
0

我试图编写一个exe文件,它还导出了可以用rundll32调用的函数。这是可能的,如果是这样,为什么它不这样工作?如何实现rundll2可调用函数?

我紧随其后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,[email protected] 

RUNDLL32崩溃/ DEP踢英寸

+0

为什么你使用函数的重名称?不要'rundll32 myprog.exe,MyFunc'工作? – 2010-11-04 11:56:39

+0

这是因为该函数是以该名称导出的。我可以创建一个.def文件并以不同的名称导出它,但我不在乎它看起来有点奇怪(rundll32发现它,这不是问题),另外我真的不知道如何告诉它使用它.def文件。 – flacs 2010-11-04 12:18:29

回答

2

称为的Rundll32.exe使用的LoadLibrary()加载可执行映像。这对EXE来说不太可能发挥作用,它不希望在非默认地址上加载。这是保证发生,rundll32.exe已占用该默认地址。不知道你是否可以修改链接器,以便它不会忽略重定位记录。

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