我创建了一个 DLL,并希望在 Windows 上使用 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()
在阅读本文时,我发现了几个关于and的警告,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
包括rundll32.exe
in cmd 似乎有效。
相关文档:
CreateProcess
RunDll32.exe