草庐IT

c++ - 加载 DLL 不初始化静态 C++ 类

我有一个在运行时加载的DLL。DLL依赖于内部工作的静态变量(它是一个std::map),这个变量在DLL中定义。当我在加载后调用DLL中的第一个函数时,我从DLL中得到一个SegFault,map从未被初始化。从我从DLL加载中读到的所有内容来看,静态和全局数据初始化甚至应该在调用DLLMain之前发生。为了测试静态初始化,我添加了一个打印出一条消息的静态结构,甚至还设置了一个断点以备不时之需。staticstructa{a(void){puts("Constructing\n");}}statica;在调用DLLMain或函数之前没有消息或中断。这是我的加载代码:dll=LoadL

c++ - 运行时检查失败 #0 从 kernel32.dll 加载 QueryFullProcessImageName

我有一个应用程序需要同时在WinXP和Vista64上运行。我的程序需要QueryFullProcessImageName()才能在Vista上运行,但不能在XP上运行。我尝试通过kernel32.dll加载QueryFullProcessImageName()(而不是静态链接),以便相同的可执行文件可以在WinXP和Vista上运行。加载它的代码是://onlygetscalledonvistaboolLoadQueryFullProcessImageName(){HMODULEhDLL=LoadLibrary("kernel32.dll");if(!hDLL)return(0);/

c# - 从 C++ 调用 C++ DLL 可以,但不能从 C# 调用

我有一个名为tccdvc.dll的DLL,它是此处提供的SDK的一部分:http://www.commell.com.tw/Download/Driver/Industrial%20Peripheral/Driver/MPX-885/MPX-885%20SDK%20(1.2)/SetupCOMMELL%20MPX-885_20100627.rarDLL是用C++编写的,检查DLL显示它与链接器版本6.0链接,因此我假设它是用VC++6.0编写的。DLL不附带源代码,只有一个.lib文件和一个.h文件。所有导出的函数都声明为extern"C"(因此没有C++名称修改)并使用APIENTR

C++: list 和从不同目录动态加载 DLL

关于我想要实现的目标的长篇故事我正在开发一个将DLL作为插件动态加载的程序。我正在使用MicrosoftVisualC++2008编译程序。不过,我们假设应该支持Qt工作的任何VisualC++版本。程序目录布局如下:|plugins/|plugin1.dll|plugin2.dll|QtCore4.dll|QtGui4.dll|program.exeprogram.exe发现所有插件DLL文件,对它们执行LoadLibrary()并调用某个签名函数以查明它是否真的是一个插件。这在安装了适用于MSVC90的vcredist的计算机上运行良好。当然,为了使程序在所有计算机上运行,​​我必

c++ - CMake:如何确定可执行文件所需的所有 .DLL/.SO 文件?

假设我的程序需要多个DLL才能运行。我应该在我的发行版中向用户提供该DLL。现在我需要QtCore4.DLL、QtGui4.DLL、msvcp90.DLL、msvcr90.DLL、mylib.DLL、Kernel32.DLL...如果CMake可以获得DLL(或.SO)文件的完整列表,那就太好了。然后我会从该列表中删除诸如“Kernel32.DLL”之类的项目,并将DLL复制到我的分发版中。我不能保证下一个构建将在相同版本的VisualStudio上完成,因此硬编码路径如“C:\ProgramFiles\MicrosoftVisualStudio9.0\VC\redist\x86\Mi

c++ - 同一 (Boost) DLL 的多个版本可以在同一进程中共存吗?

我的(C++,跨平台)应用程序大量使用Boost库(比如版本1.x),我还想链接到第3方(供应商)的SDK(无来源),本身使用Boost(但版本1.y)。因此,我们都动态链接到我们自己的BoostDLL版本,CRT是相同的。因此,在运行时,我的应用程序必须同时加载Boost1.x&1.y的DLL。相关的潜在问题和陷阱是什么?我无法更改供应商的SDK,但我可以更改我的应用程序。也许我应该尝试针对我的Boost1.x进行静态链接?PS:Boost的DLL的名称包括它们的版本,所以没有名称冲突,两者都是可识别的。不是通常的DLLhell。 最佳答案

c++ - 为什么隐式 DLL 链接需要相关的 Lib 文件而显式链接不需要?

在Windows环境中,当我尝试显式(使用LoadLibrary)将DLL链接到我的程序时,首先我需要根据每个定义函数指针DLL中的函数签名。然后使用“GetProcAddress”获取函数地址并将它们分配给那些指针。当我尝试将DLL链接到我的程序时隐式(使用头文件)首先需要相关的头文件来获取函数签名。然后它需要用DLL生成的相关Lib文件。我的问题是为什么隐式链接也需要一个Lib文件?它需要从“Lib”文件中检索哪些无法从DLL或Header文件中获取的信息?如果有问题2,显式加载时如何检索信息?我已经通过了this问题。但我无法理解任何有值(value)的理由。拜托,有人可以帮助用

c++ - 非 Qt 应用程序中基于 Qt 的 DLL 中的事件循环

我在整个网络上搜索答案,但没有找到解决我的问题的方法。或者也许我理解了,但因为我是C++/编程/Qt的初学者,所以我不理解它们。最接近的是这里的问题UsingaQt-basedDLLinanon-Qtapplication.我尝试使用这种方法,但到目前为止没有成功。我尝试创建一个DLL,它是我们USB设备的API。该库也应该适用于非Qt应用程序。我已经对所有Qt内容和私有(private)类进行了PIMPL,因此下面的代码是公共(public)类下的一层。我正在使用QSerialPort和大量SIGNAL/SLOT,所以我需要QCoreApplications事件循环。ReaderSe

c# - 在托管 DLL 中加载 C++ DLL 时出现 EEFileLoadException

我有一个非托管C++DLL,我想从C#exe中调用它。我研究了可能的解决方案,在我看来最好的办法是使用C++/CLI作为非托管C++类的包装器。所以我写了一个C++/CLI类,看起来像这样,并被编译成一个DLL(我知道它应该有一个析构函数和一个终结器,但到目前为止代码不会进入Main函数,所以我排除了它们简单起见):#includeusingnamespaceSystem;namespaceDependencyInterface{publicrefclassDependencyTester{public:DependencyTester(){_class=newCPPClass();}

c# - 将函数从 C++ dll 导出到 C# P/Invoke

我已经构建了一个C++dll,我想从C#代码调用它。我能够调用一个函数,但另一个在C#代码尝试加载dll时引发异常。标题看起来像这样:extern"C"__declspec(dllexport)BOOLInstall();extern"C"__declspec(dllexport)BOOLPPPConnect();这会生成一个带有稍微困惑的导出表的dll(名称字段中的foo=foo是什么意思?):FileType:DLLSectioncontainsthefollowingexportsforPPPManager.dll00000000characteristics499F44F0ti