我已經創建了一個DLL,並希望在Windows上使用rundll32.exe命令執行其中一個函數。使用CreateProcess執行rundll32.exe
使用rundll32.exe,它從命令行正確運行;不過,我想從一個單獨的程序中調用它(rundll32.exe)。由於我使用的基礎庫(Easyhook)中的32/64位兼容性問題,我無法直接從我的代碼中調用該函數。
下面是我使用的嘗試運行DLL函數是什麼:
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
LPCTSTR application = "C:\\Windows\\system32\\rundll32.exe";
LPTSTR cmd = "C:\\Projects\\Test\\mydll.dll,MyFunc";
BOOL cpRes = CreateProcess(application,
cmd,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi);
if(cpRes == 0) {
cout << "ERROR\n";
cout << GetLastError() << endl;
} else {
cout << "DLL Launched!" << endl;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
輸出到我的控制檯總是DLL Launched
;然而,我沒有看到我的DLL實際被調用的效果(當前以命令寫入文件的方式被刪除)。
如果我用諸如C:\\Windows\\system32\\notepad.exe
之類的東西換出應用程序,程序將成功運行。
完成,這裏有MyFunc
身體:
ofstream file;
file.open("C:\\Projects\\Test\\test.txt");
file << "I wrote to a file!";
file.close();
沒有任何理由的CreateProcess不能與RUNDLL32使用?在閱讀本文時,我發現了幾條關於LoadLibrary()
和DLLMain
的警告,但它不是似乎就像它們與此相關。
更多的澄清:
這是當前的32位應用程序(可能)啓動32位rundll32.exe
(邏輯將在後面加入到調用32或64位版本)。
我的DLL如下:
extern "C" __declspec(dllexport) void CALLBACK MyFunc(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
void CALLBACK MyFunc(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow) { ... }
其中也有.def
文件有:
EXPORTS
MyFunc
運行
C:\Windows\system32\rundll32.exe C:\Projects\Test\mydll.dll,MyFunc
產生預期的結果。
更新
設置application
到NULL
,幷包括在cmd中的rundll32.exe
在評論中提到似乎工作。
相關的文檔:
CreateProcess
RunDll32.exe
什麼是COUT的'輸出<< GetLastError函數()<< ENDL;'如果沒有正確啓動DLL ? –
@NaseefUrRahman輸出爲[0](https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v = vs.85).aspx)。 – user5786682
您試圖從DLL調用的函數的確切簽名是什麼? –