小编DGe*_*aar的帖子

如何防止特定的DLL加载到我的进程中

我想我已经对此进行了充分的研究,但没有找到可接受的答案。首先是大招: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++ dll winapi qt loadlibrary

5
推荐指数
1
解决办法
1848
查看次数

make_unique 不会编译用于创建单例实例

全部,

我正在使用 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)

这对我来说感觉像是一个错误,因为这两种形式在功能上应该是相同的?想法?

c++ singleton private-constructor unique-ptr c++14

2
推荐指数
1
解决办法
4751
查看次数