Articles of DLL

LoadLibrary静态/全局和线程

假设我有一个具有以下静态/全局的DLL: ClassA Object; 除了ClassA的实现之外,它还包含一个“常规”的ClassB,如果ClassA还没有被构造,这将不能正常工作(这就是为什么我使ClassA成为静态/全局的原因)。 在Windows中,我相信DLL加载器会在调用ClassB的构造函数时加载这个DLL,对吗? 此时,ClassA将被build造,然后ClassB的build设将随之而来。 如果第二个线程出现并构造ClassB,ClassA将不会被构造,因为它已经被构造了。 现在,我的问题是 – 如果ClassB是由两个线程同时构build的。 所以线程1将开始构buildClassA。 在执行ClassB的构造函数之前,线程2是否等待ClassA完全构造? 换句话说,LoadLibrary()是否使用CriticalSection来确保DLL的静态/全局variables的线程安全的初始化? 我的直觉是'是',但我似乎无法find任何文件说某种方式或其他。

顺序GUID

我希望有人能回答这个问题。 如何在rpcrt4.dll类的UuidCreateSequential方法使用它的guid? 我知道这一点:微软更改了UuidCreatefunction,因此不再使用机器的MAC地址作为UUID的一部分。 由于CoCreateGuid调用UuidCreate来获取它的GUID,所以它的输出也改变了。 如果您仍然喜欢按顺序生成的GUID(有助于在系统registry中保留相关的一组GUID),则可以使用UuidCreateSequential函数。 问题背后的原因是。 如果我使用此函数在Web群集中生成顺序的GUID,如何确保GUID接近一系列GUID而没有可能重复的GUID?

Visual Studio 2015 C ++应用程序需要客户端客户端上的api-ms-win-crt-runtime-l1-1-0.dll

我已经使用Visual Studio 2015社区版build立了一个应用程序。 当我的一些用户试图运行它,他们收到以下错误: 程序无法启动,因为您的计算机缺lessapi-ms-win-crt-runtime-l1-1-0.dll。 尝试重新安装程序来解决这个问题。 显然这是通过在Windows中安装通用C运行时更新 (KB2999226)来解决的。 我可以在安装脚本中检查修补程序,但是我发现这样做的所有方法要么太慢,要么不可靠 。 我怎样才能防止这种错误发生? 我可以更改我的解决scheme,以便我不需要这种依赖性? 我是否连接了一些我可以删除的东西? 我可以重新分配与我的应用程序的修补程序? 编辑:在项目属性中,“目标平台版本”是8.1,“平台工具集”是“Visual Studio 2015(v140)”,如果有帮助的话。 编辑2:我已经试过将所有的通用C运行时库DLL复制到应用程序目录,因为微软现在允许(但不build议)本地模式安装的UCRT 。 C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64有41个文件,而api-ms-win-crt-runtime-l1-1-0.dll就是其中之一。 但是,现在运行该应用程序导致此错误: 应用程序无法正确启动(0xc0000142)。 单击确定closures该应用程序。 我试过用MSVS 2015debugging应用程序,但没有得到任何好处。 我在Dependency Walker中打开了可执行文件,看起来我错过了这个答案中列出的类似DLL ,它说Dependency Walker是旧的,这是一个红色的鲱鱼。 我尝试通过进程监视器(procmon)运行应用程序,没有什么不寻常的。 应用程序简单地调用WerFault.exe上的“进程创build”,然后“线程退出”。 编辑3:我启用加载程序捕捉可执行文件,并得到这个从CDB运行时,如果有帮助: … 00c0:1200 @ 02106250 – LdrpFindOrMapDependency – RETURN: Status: 0x00000000 00c0:1200 @ 02106250 – LdrpFindOrMapDependency – ENTER: DLL name: api-ms-win-core-sysinfo-l1-2-1.dll. […]

如何从DLL中获取HWND?

我有一个DLL,我想用Direct Sound播放声音。 为了播放声音,我需要可执行文件的HWND。 我没有加载DLL的可执行文件的HWND。 如何在不从可执行文件传入DLL的情况下获取它?

DLL函数名称使用dumpbin.exe

我已经在Visual Studio 2010中编写了一个包含许多函数和类的.dll库。当我查看文件的内容时: dumpbin.exe /EXPORTS myDll.dll 我使用某种函数位置指针获取长的函数名,如下所示(在.dll中的第二项): 2 1 0001100A ?Initialize@codec@codecX@@SANNN@Z = @ILT+5(?Initialize@codec@codecX@@SANNN@Z) 这在某种程度上很难阅读,但是我从其他.dll-s中看到了“更好的”过程/函数列表,如下所示: 141 8C 00002A08 PogoDbWriteValueProbeInfo 我怎样才能让这个.dll列表看起来像这样? PS:我的dll源代码如下所示: namespace codecX { class codec { public: static __declspec(dllexport) double Initialize(double a, double b); …

由于MSVCR110.dll,MS Visual Studio 2012最终无法启动

当我尝试运行MVS 2012时,我总是得到一个错误 – 入口点过程_crtCreateSymbolicLinkW在库DLL MSVCR110.dll中找不到。 我已经从我的另一台计算机上复制这个DLL文件,一切正常,但它并没有帮助0_o。 操作系统 – Windows 7。

C ++错误:名称后跟'::'必须是一个类或命名空间名称。 DLL中的WindowsForm

所以我在visual studio 2012中创build了一个windows32 C ++ dll应用程序,然后在头文件部分添加了一个windows窗体,并给它起了名字“UserInterface.h”。 当我点击添加button,我得到一个popup窗口说:“你正在添加一个CLR组件到一个本地项目。你的项目将被转换为具有公共语言运行时支持。你想继续吗? 我点击是,它使文件“UserInterface1.cpp”和“UserInterface1.h”。 但是在“UserInterface1.h”中却出现了错误。 这里是它的内容: #pragma once namespace AssultCubeDLL { //ERRORS HERE: ****************************************************** using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Summary for UserInterface /// </summary> // ERROS HERE: ********************************************************* public ref class UserInterface : public System::Windows::Forms::Form […]

Python | 访问DLL使用ctypes

我试图访问Firefox浏览器附带的DLL( nss3.dll )中的一些function。 为了处理这个任务,我在Python中使用了ctypes。 问题是,它在加载到内存中的DLL的初始点失败。 这是我必须这样做的代码片段。 >>> from ctypes import * >>> windll.LoadLibrary("E:\\nss3.dll") 我得到的例外是 Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> windll.LoadLibrary("E:\\nss3.dll") File "C:\Python26\lib\ctypes\__init__.py", line 431, in LoadLibrary return self._dlltype(name) File "C:\Python26\lib\ctypes\__init__.py", line 353, in __init__ self._handle = _dlopen(self._name, mode) WindowsError: [Error 126] The specified module could not be found 我也尝试从Firefox安装path加载它假设可能有依赖关系。 […]

py2exe生成dll?

有没有办法使用py2exe或其他方法来生成DLL文件,而不是exe文件? 我想基本上创build一个普通的函数,但正常的win32 DLL,但这些函数将被编码在Python而不是C ++。

“用静态运行时混合一个dll boost库是一个非常糟糕的主意……”

我在Visual Studio解决scheme中有两个项目。 一个构build一个静态的LIB,另一个构build一个dynamic的DLL。 两者都使用静态运行时链接(/ MT和/ MTd),并使用Boost。 Boost不是我的决定 – 我想挑选它,但是我被委员会推翻了。 LIB生成良好,但DLL从auto_link.hpp(第354行)咳嗽了一个错误:“混合使用静态运行时的dll boost库是一个非常糟糕的主意……”。 #if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK) # define BOOST_LIB_PREFIX #elif defined(BOOST_DYN_LINK) # error "Mixing a dll boost library with a static runtime is a really bad idea…" #else # define BOOST_LIB_PREFIX "lib" #endif 我没有定义BOOST_DYN_LINK。 看来Boost正在做一个跳跃,因为我正在构build一个DLL(_USRDLL和_​​WINDLL被定义),我必须要dynamic运行时链接(/ MD或/ MDd,它定义_DLL)或DLL连接Boost。 这是不正确的,因为我特别要求静态链接(/ MT或/ MTd)。 我提交了一个针对Boost的错误报告 ,因为它的错误假设,但是这并不能帮助我使用这个库。 在报告中,Boost维护人员坚持认为,尽pipe事实certificate我不是,但Boost在至less30个文件中操纵它。 我在Boost邮件列表上find了一个答案 […]