我正在搜索为什么rundll32.exe进程正在我的系统上运行,当我发现它作为容器运行dll作为application / exe时的信息。我无法理解我希望将dll作为应用程序运行的原因/用例。库不仅仅是为了提供功能支持而不是作为单独的应用程序运行吗?
答案 0 :(得分:3)
rundll32并不意味着通常会运行dll" (它实际上没有任何意义,dll没有一个入口点,而且经典" dll没有足够的元信息来正确调用任何导出的符号)。
相反,它允许使用符合某些明确定义的规范的dll作为具有多个入口点的可执行文件;我认为这个想法要么允许将多个小实用程序与多个共享代码合并为一个二进制文件,和/或提供额外的测试"入口点(手动调用)到库主要供其他应用程序使用。
rundll的作用本质上是在内存中加载dll并调用指定的函数,期望它必须具有与exe入口点相同的签名。
答案 1 :(得分:2)
这个EXE可以加载任何DLL并获取指定函数的地址,并调用它。这样就不需要编写EXE来调用特定DLL上的函数(前提是这样的函数可以在加载DLL后直接调用)。
加载DLL 意味着从EXE调用LoadLibrary
,它试图在当前进程(RunDLL32.EXE)中初始化DLL。在内存中加载DLL意味着调用给定DLL的DllMain
,这由加载程序(OS)完成。如果全部成功,则进程获取已加载DLL的句柄。
成功获取DLL句柄后,它将使用GetProceAddress
获取函数的地址,并通过函数的地址调用该函数。
例如(在命令提示符下):
rundll32.exe user32.dll,LockWorkStation
将加载user32.dll
,然后调用LockWorkStation
,这将最终锁定工作站。
我不确定RunDLL32如何找到原型,必需参数,返回类型和调用约定。