我想从命令行调用各种Windows DLL中的功能。看起来该rundll32
实用程序将满足我的需要-它需要一个DLL名称和一个函数名称,并使用参数运行该函数。
我当然希望不会有任何问题。我可以使用哪些功能rundll32
?
几乎肯定会有问题。
rundll32
?好吧,最理想的情况是,您根本不会使用它-已弃用:
Rundll32是Windows 95的遗留物,至少从Windows Vista开始就已弃用,因为它违反了许多现代工程准则。如果通过Rundll32运行某些内容,那么您将失去根据所运行的内容定制执行环境的能力。
rundll32
仅设计用于调用非常特定类型的函数,特别是用于创建窗口和处理窗口消息的函数。在对这个微软文档rundll32
界面解释说,我们在调用函数必须采取一个HWND
,一个HINSTANCE
,一个LPSTR
,和int
(按顺序),并且必须使用_stdcall
/CALLBACK
调用约定。
有关您要调用的功能,请查阅MSDN文档,以查看其是否具有该签名。例如,ExitWindowsEx
不合适。实际上,我找不到所记录的带有该签名的单个函数。
如果不确定这一切意味着什么,则可以跳过下一部分,然后继续进行最后一部分。
还记得整个功能签名的事情吗?rundll32
假定您要调用的函数具有正确的签名,无论实际上是否如此。当其假设错误时,与堆栈相关的异常奇特的事情可能会继续下去。(堆栈是一个存储位置,用于存储在函数之间传递的参数。)
不匹配的函数签名将导致将提供的数据rundll32
解释为不同的内容,因为函数期望其参数位于堆栈中。第一个基准rundll32
供应是一个窗口句柄,该窗口句柄以不确定的方式分配。因此,如果您滥用了rundll32
,您实际上是在将随机数据作为第一个参数传递。进一步阅读:如果您不匹配调用约定,会出什么问题?
其余参数效果不佳。即使您通过来向函数提供命令行rundll32
,也不会将其解析为适合该函数的数据类型。取而代之的是,rundll32
仅获取整个“额外”文本,将其塞入字符串变量,然后将指向该数据的指针作为后面的参数传递给函数。这取决于解析文本的功能。因此,永远不会希望使用带有用户提供的参数的任意函数rundll32
。
如果目标函数不要求任何参数,那不是完全的灾难,但是您仍然在搞砸堆栈。里面有代码rundll32
可以解决这个问题,但这并不能给您借口继续滥用它。
如果您正在使用rundll32
旨在通过这种方式使用的第三方DLL中调用兼容功能,则仍然可能会遇到问题。rundll32
始终选择使用所有Windows新功能(例如Data Execution Prevention),这些功能可能会引入并非为第三方代码设计的更改;这就是为什么该行为是选择加入的。
幸运的是,有一种更好的方法可以做您想要的事情。
试图锁定工作站(user32.dll,LockWorkStation
)?快跑吧tsdiscon
。
尝试关闭系统(user32.dll,ExitWindowsEx
)?将该shutdown
实用程序与适当的标志一起使用-shutdown /?
有关帮助,请参见。
您是应用程序开发人员,并且尝试在不编写新EXE的情况下调用您自己的DLL函数吗?可能是用C ++编写该EXE。
试图运行其他东西吗?我的开源实用程序SprintDLL支持用户指定的参数列表,多种调用约定以及可与多个函数及其输出配合使用的脚本。如果您只想使用Windows附带的工具,则可以使用PowerShell进行P / Invoke。
将该问题和答案作为参考,可用于更正建议
rundll32
以可疑方式使用的材料。如果您看到有人在骂人rundll32
,请给他们指向此页面的链接!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句