如何解决从非提升插件DLL
我正在使用Visual Studio / C ++为Windows主机应用程序制作一套64位插件DLL,从当前版本开始,它们进入的setup.exe在ProgramData下创建一个共享的用户可写文件夹在其中缓存了各种(非用户专用的)数据文件。较旧的版本还没有该文件夹。
但是,我的插件二进制文件的分发也经常不可用。它们由第三方捆绑包重新打包,该捆绑包只能生成DLL的哑文件副本(因此,我不需要真正的setup.exe功能,例如创建文件夹+设置权限)。而且由于我的二进制DLL都是100%独立的,因此从历史上看,用户也可以将DLL复制到他们认为合适的其他计算机上,但是off也缺少新的文件夹设置阶段。
我正在寻找一种解决方法,让我的DLL在丢失时在运行时创建该文件夹。我知道我无法随时提升宿主进程,但是我想到了以下几种方法:
- 我的DLL中有一个额外的“ FixSetup”入口点,当需要时,启动提升的RunDLL32.exe,并使其在我的DLL中使用该入口点。
但是,我看到各种各样的人到处都在谈论RunDLL的优劣,并建议不要使用它,但是那又是自Windows XP以来的事情,它仍然存在。我还听说过RunDLL具有其自己的运行时上下文,该上下文可以随每个Windows版本进行更改(例如在可用时切换到高DPI感知),因此可以在其中运行“敌对”环境(在Raymond Chan的文档中阅读)博客IIRC)。我真的应该害怕使用它,还是我的用例如此简单,以至于几乎无法破坏? (没有GUI,只是一个包装好的CreateDirectory调用) - 创建一个小的“ FixSetup.exe”,该文件仅用于创建文件夹,将其打包到我的DLL的资源中,然后在运行时对其进行临时提取+运行提升。
这会使我的DLL膨胀(取决于我能得到的.exe大小如何,我觉得它比上面的1.还更脆弱+复杂(文件提取等全部;可能最好也签名实用程序exe,以防止HIPS /防病毒发挥作用有趣等?)。 - 更改我的DLL,以便它们实际上是变相的.exe,它们恰好会导出主机预期的DLL入口点,以便我可以直接调用它们(升高)。
我知道有一些主要警告事项在这里(例如DLL或非DLL模式中包含的C运行时之间的冲突,Visual Studio可能不批准这些恶作剧等),老实说,在谈论完这一部分后,我已经觉得我需要洗个澡。因此,虽然理论上可行,但这是我的不得已。
有人对我的上述不确定性有何建议?还是一个更好的建议?
编辑
我已经设法使选项1正常工作。尽管它可以无缝运行,但我发现一个缺点:UAC提示符(可以理解)询问用户是否要运行Microsoft签名的RunDLL32.exe。这可能使人们感到无所适从(即:如果他们甚至阅读这些提示...)。我宁愿让UAC提示询问MyCompany签名的MyPluginSetup.exe,所以现在我更倾向于选择选项2。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。