草庐IT

c++ - 跨 dll 边界的内存分配和释放

我知道在一个dll中进行的内存分配随后在另一个dll中释放会导致各种问题,尤其是与CRT相关的问题。在导出STL容器时,这些问题尤其严重。我们以前遇到过这类问题(在编写与我们的库链接的自定义Adob​​e插件时),我们通过定义我们自己的分配器来解决这些问题,我们在所有容器中使用它,例如:typedefstd::vector>VectorSessionFields;typedefstd::set,OurAllocator>SetSessionFields;这在向我们的代码传递类型或从我们的代码传递类型时效果很好,但是我们遇到了一个问题,因为我们现在必须调用Adob​​eSDK中的一个函数

c++ - Dll内存管理

我对Windows如何管理.dll的内存没有任何疑问。当.dll加载到主机时进程,内存是怎么管理的?.dll是否可以访问整个主机进程可用的内存或者只是其中的一部分?即是内存有限制由函数内部分配.dll?STL类如字符串、vector(动态地增加存储空间)等dll,在这里工作没有问题吗? 最佳答案 “内存管理”通常是一项分担的责任。操作系统将地址空间以大块的形式交给运行时,然后由运行时将其以较小的部分交给程序。该地址空间可能已分配也可能未分配RAM。(如果没有,会有交换空间来支持它)基本上,当加载DLL时,Windows会为代码和数据

c++ - Qt:如何创建 Windows DLL(导出函数)?

我需要创建一个导出函数并具有图形用户界面的WindowsDLL。DLL中的GUI的原因是DLL用作另一个第3方应用程序的插件。目前我只能访问VisualStudioExpress,AFAIK不支持MFC,所以我正在寻找在DLL中创建GUI的替代方法。经过一些研究,我遇到了Qt,它看起来很有希望。似乎只使用QtCreatorIDE而不是VisualStudioExpress可能更容易。但是,如何在QtCreator中创建WindowsDLL?(我猜是常规DLL,我不认为COM或托管DLL可以工作)更新:我得到了这个工作!绕了好几圈后,要加上两个重要的关键#include然后使用Qt/MF

c++ - GCC 使用 __stdcall 编译一个 dll

当我们在visualstudio2008中使用__stdcall编译dll时,dll中编译的函数名称是。函数名虽然当我们使用GCC使用wx-dev-cpp编译相同的dll时,GCC会附加函数具有的参数数量,因此使用Dependencywalker的函数名称看起来像。FunctionName@numberOfParameters或==FunctionName@8如何告诉GCC编译器从dll中导出的符号中删除@nn? 最佳答案 __stdcall修饰函数名,开头加下划线,结尾加参数字节数(@分隔)。所以,一个函数:void__stdca

c# - 可以从 C DLL 调用 C# DLL 吗?

我用C#构建了一个DLL。现在我想使用REnvironment调用该DLL中的函数。R环境支持调用非托管C/C++DLL,但不支持调用.NETDLL。所以我的问题是,我可以从C/C++DLL调用C#DLL中的函数吗?如果是这样,您是否有指向有关如何执行此操作的信息的链接? 最佳答案 最直接的方法是将C#DLL中的一个C#类公开为COM对象,然后从C/C++DLL创建它的一个实例。如果这不是一个可接受的选项,您需要创建一个混合模式的C++DLL(其中包含托管和非托管代码)。您的C/C++DLL可以调用混合模式DLL中的导出函数,后者又

c++ - 摆脱我的 Release 应用程序中的 msvcr120.dll/msvcp120.dll 依赖项 (VC++ 2013)

我知道有一些关于如何将msvcr120.dll/msvcp120.dll包含到您的项目中的问题。但我想放弃这种依赖。我在VisualStudio2013中以Release版本编译程序。我不依赖于任何VS特定命令(#pragma等)或预编译header等。我想将它编译成一个单一版本的.exe并提供给用户而不要求他安装VC++RedistributesforVS(用户将在Windows7、Windows8,也许是WindowsXP)。这可能吗?如果是,怎么办? 最佳答案 您可以通过设置/MT标志将运行时静态链接到您的项目。您可以在Vis

c++ - 从正在运行的进程中注入(inject) DLL 后弹出

我写了这个函数来将DLL注入(inject)到正在运行的进程中:DLL_ResultsCDLL_Loader::InjectDll(){DWORDThreadTeminationStatus;LPVOIDVirtualMem;HANDLEhProcess,hRemoteThread;HMODULEhModule;if(!isInit())returnNOT_INIT;if(isInjected())returnDLL_ALREADY_HOOKED;hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);if(hProcess==

c++ - C++ 中的非托管 DLL

我一直在阅读许多关于C++中的非托管DLL的教程/文章。然而,对于我来说,我似乎无法理解这个概念。关于它是否需要头文件、如何导出头文件、我是否需要.lib文件以及你有什么等问题,我很容易感到困惑。那么,让我们假设我只有这样一个函数:publicintcalculateSquare(intnum){returnnum*num;}忽略实际代码,我需要什么才能将这个简单的函数本身变成一个我可以调用的DLL?我只是将__dllexport或其他任何内容添加到第一行,还是需要标题?我对这一切感到困惑。 最佳答案 我怎么强调都不过分,C++编译

c++ - 如何让 Visual Studio 将所需的 .dll 文件复制到发布文件夹中?

我正在使用Visual Studio 2012使用C++,开发一个Qt申请。我可以编译和调试它,但是不知为何,Debug或Release文件夹中没有.dll文件。我尝试了其他一些帖子解决方案,但都没有用。那么,如何让VisualStudio将所需的.dll文件复制到发布文件夹中?我认为它应该是某个地方的一个选项。我刚开始考虑手工复制它。 最佳答案 太多糟糕的建议,DLL不能成为资源。Windows要求将代码存储在具有适当PE32header的单独的可执行文件中。这允许它创建内存映射文件以将文件内容映射到内存中,从而允许代码由多个进程

c++ - 如何在 C++ 中使用带有 LoadLibrary 的 COM DLL

首先,COM对我来说就像黑魔法。但是我需要在我正在处理的一个项目中使用COMdll。所以,我有一个正在开发的DLL,我需要一些在单独的COMDLL中可用的功能。当我查看带有Depends.exe的COMDLL时,我看到了DllGetClassObject()等方法和其他函数,但没有我感兴趣的函数。我可以访问COMDLL(遗留)源代码,但它一团糟,我宁愿使用二进制形式的COMDLL,就像一个不知道里面发生了什么的大黑盒子。那么,如何使用LoadLibrary从我的代码中调用COMDLL函数?可能吗?如果是,您能否举例说明如何操作?我正在为这个项目使用VisualStudio6。非常感谢!