【Windows】你所不知道的Rundll32

很多时候我们用rundll32.exe作为宿主来运行dll的某个函数,每次都是潦草的搬一段代码完事。
这次有个dll需要导出给rundll32运行的函数,就先找了下资料,汇总了一下相关的知识点。

用法

rundll32.exe <dllname>,<entrypoint> <optional arguments>
<dllname>最好给完整路径,且注意路径中不能有空格、逗号和引号,所以最好把路径转成短文件名来避免出现非法字符
<dllname>和<entrypoint>之间用,隔开,不能有空格,<entrypoint>和<optional arguments>之间必须有空格
<optional arguments>这部分rundll32不会解析,而是作为<entrypoint>的第三个参数传递过去

导出函数

我们先来看下导出函数的原型
void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
首先容易被忽略的一个知识点就是认为导出函数就是上面这样的MBCS编码的(第三个参数可见),但是现在大多数情况下,我们都是使用Unicode编码了,难道是因为这是历史原因吗?
当然不是,其实是可以导出Unicode版本的,我们先来看下rundll32是如何找到这个导出函数的:

  1. 给函数名加上W后缀,用GetProcAddress找(可见首先找的就是Unicode版本)
  2. 如果1没找到,那么加上A后缀找
  3. 如果2也没找到,那么就用原名字找

从上面的三个查找步骤,我们可以知道,如果我们要导出Unicode版本的,那么就得导出类似EntryPointW这样的函数名,且第三个参数为LPWSTR,然后使用的时候,要用rundll32 abc.dll,EntryPoint <传递的命令参数>
这样才能正确工作。
而如果导出函数是带A后缀,或者不带后缀的话,rundll32就会视为这个是MBCS编码的导出函数了。

总结

从上面的描述,可以知道,如果我们导出Unicode版本的函数,在使用的时候就要注意去掉W后缀
一旦有了这种潜规则,给别人使用的时候,就很容易出问题,所以一般情况下,还是建议导出不带后缀的MBCS版本

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 12,400评论 0 27
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,088评论 19 139
  • php.ini设置,上传大文件: post_max_size = 128Mupload_max_filesize ...
    bycall阅读 11,802评论 3 64
  • 动态调用动态库方法c/c++linuxwindows 关于动态调用动态库方法说明 一、 动态库概述 1、 动态库的...
    KINGZ1993阅读 14,748评论 0 10
  • 我想回头望 把故事从头讲 时光迟暮不返 人生已不再来 此生多勉强 此生多寒凉 等不到那盛装出场的未来
    阿吧阅读 1,670评论 0 2

友情链接更多精彩内容