DGe*_*aar 5 c++ dll winapi qt loadlibrary
我想我已经对此进行了充分的研究,但没有找到可接受的答案。首先是大招:Windows 8.1,Visual Studio2013。尽管如此,我认为这些都不重要。
问题如下。我正在编写的应用程序使用A.dll。我们使用第三方供应商产品(备份程序,但这并不重要),该产品已在HKEY_CLASSES_ROOT \ Directory \ shellex \ ContextMenuHandlers下安装了上下文菜单处理程序控件。假设它的路径是c:\ Program Files \ Vendor \ control.dll。
现在的问题是,当我的程序打开一个文件选择器对话框时(这是一个使用QFileDialog的Qt程序,然后使用标准的Windows),该控件被加载以提供上下文相关的右键单击功能。此控件取决于“ A.dll”的不同版本,并且在加载control.dll时,我的程序立即崩溃。
我不需要这个额外的功能。我想做的是防止在我的进程中加载此特定的dll(control.dll)。在面向对象的世界中,我将简单地重载LoadLibrary(),检查该特定的DLL,然后以其他方式调用标准的DLL。但是,这似乎不可行。
是否有捷径可寻?
谢谢!担
在这种情况下,您将启动一个标准的 Windows 打开文件对话框,该对话框在内部托管 Windows 资源管理器作为其 UI 的一部分,并且资源管理器加载 Shell 扩展 DLL。为了防止这种情况,您必须:
直接调用GetOpenFileName()
API,通过省略该标志来选择使用旧式对话框而不是较新的资源管理器样式对话框OFN_EXPLORER
(较新的IFileOpenDialog
API 不支持此选项)。旧式对话框不支持 Shell 扩展(但它的外观也过时)。
根本不使用标准的“打开文件”对话框。让你拥有。
另一种选择是让资源管理器正常完成其工作,但创建并注册您自己的填充程序 DLL 作为有问题的 Shell 扩展的替代品。让垫片检查调用进程是否为explorer.exe
. 如果是这样,则加载所有操作并将其委托给原始扩展,否则不执行任何操作。请参阅
如何在 FileOpen 对话框中禁用 Shell 扩展。
另一种选择可能是为有问题的 Shell 扩展创建并行程序集清单,并让该清单显式声明要加载哪个 DLL,以便扩展加载其自己的 DLL 版本,而不是您的应用程序正在使用的版本。
归档时间: |
|
查看次数: |
1848 次 |
最近记录: |