2010-11-04 77 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文件重命名導出的函數。