RunDLL32 不执行任何操作
Posted
技术标签:
【中文标题】RunDLL32 不执行任何操作【英文标题】:RunDLL32 does not execute anything 【发布时间】:2020-10-12 21:50:47 【问题描述】:我正在尝试创建一个可以使用 RunDLL32 执行的 DLL。我知道 RunDLL32 运行正常,因为如果我执行以下命令,它会弹出一个消息框:
rundll32 printui.dll,PrintUIEntry
/。
但是我无法让它执行我创建的 DLL,如下所示:
// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
switch (ul_reason_for_call)
case DLL_PROCESS_ATTACH:
MessageBox(0, L"Hello1", 0, 0);
break;
case DLL_THREAD_ATTACH:
MessageBox(0, L"Hello2", 0, 0);
break;
case DLL_THREAD_DETACH:
MessageBox(0, L"Hello3", 0, 0);
break;
case DLL_PROCESS_DETACH:
MessageBox(0, L"Hello4", 0, 0);
break;
return TRUE;
代码编译良好(在 Visual Studio 2017 中,发布模式,x64)但是当我执行时
RunDLL32 MyDLL.dll
什么都没有发生。没有错误消息,没有输出,也没有消息框。这是为什么呢?
【问题讨论】:
【参考方案1】:由于您正在编译 64 位 DLL,请确保您运行的是 64 位版本的 RunDll32:
rundll32.exe equivalent for 64-bit DLLs
每this page:
如果您将错误类型的 DLL 传递给 Rundll32,它可能无法运行而不会返回任何错误消息。
即使您可以让 RunDLL32 加载您的 DLL,you can't safely call MessageBox()
in DllMain()
at all。
除了DllMain
,您还需要export a function for RunDLL32 to execute。您可以在该函数中调用MessageBox()
,例如:
// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
return TRUE;
extern "C" __declspec(dllexport) void CALLBACK MyFunctionW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
MessageBoxW(hwnd, lpszCmdLine, L"Hello", MB_OK);
rundll32 my.dll,MyFunction "hello world"
【讨论】:
以上是关于RunDLL32 不执行任何操作的主要内容,如果未能解决你的问题,请参考以下文章
text 可以由mshta或rundll32执行的Scriplet,用于执行任意代码