我想我已经对此进行了充分的研究,但没有找到可接受的答案。首先是大招: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。但是,这似乎不可行。
是否有捷径可寻?
谢谢!担
全部,
我正在使用 C++14,并且正在制作一个或多或少的标准单例。我正在使用最新的 Visual Studio 2017。此代码有效:
#include <memory>
class A
{
public:
static A& getInstance()
{
if (instance == nullptr)
instance = std::unique_ptr<A>(new A());
return *instance;
}
private:
A() {}
static std::unique_ptr<A> instance;
};
std::unique_ptr<A> A::instance = nullptr;
Run Code Online (Sandbox Code Playgroud)
但是,当我将单例实例的创建更改为:
instance = std::make_unique<A>();
Run Code Online (Sandbox Code Playgroud)
我在尝试访问私有成员时收到编译错误:
Error C2248 'A::A': cannot access private member declared in class 'A'
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.14.26428\include\memory 2510
Run Code Online (Sandbox Code Playgroud)
这对我来说感觉像是一个错误,因为这两种形式在功能上应该是相同的?想法?