我的dll中有一个抽象类.
class IBase {
protected:
virtual ~IBase() = 0;
public:
virtual void f() = 0;
};
Run Code Online (Sandbox Code Playgroud)
我想进入IBase加载DLL的exe文件.第一种方法是创建以下功能
IBase * CreateInterface();
Run Code Online (Sandbox Code Playgroud)
并添加虚拟函数Release()在IBase.
第二种方法是创建另一个功能
boost::shared_ptr<IBase> CreateInterface();
Run Code Online (Sandbox Code Playgroud)
并且不需要任何Release()功能.
问题.
1)在第二种情况下,在dll(而不是在exe文件中)中调用析构函数和内存释放是否正确?
2)如果使用不同的编译器(或不同的设置)编译exe-file和dll ,第二种情况是否能正常工作.
对于不修复 C++ 的某些问题的常见解释是,它会破坏 ABI 并需要重新编译,但另一方面,我遇到这样的语句:
老实说,这对于几乎所有 C++ 非 POD 类型都是如此,而不仅仅是例外。可以跨库边界使用 C++ 对象,但通常前提是所有代码都使用相同的工具和标准库进行编译和链接。这就是为什么 MSVC 的所有主要版本都有 boost 二进制文件。
(来自这个SO答案)
那么C++有稳定的ABI吗?
如果是这样,我可以混合和匹配在同一平台上使用不同工具集编译的可执行文件和库(例如 Windows 上的 VC++ 和 GCC)吗?如果没有,有什么办法可以做到吗?
更重要的是,如果 C++ 中没有稳定的 ABI,为什么人们如此担心破坏它?
有些项目为C(以及可能的C++ - 不确定)库提供了一组"Windows"二进制文件.例如,请参阅此libxml相关页面右侧的链接.
我很确定没有办法在VC++ .lib文件和MinGW GCC .a文件之间进行转换,所以称它们为"Windows"而不是"Microsoft"二进制文件似乎有点误导.但我也很惊讶,不同的VC++版本不需要不同的二进制文件.
很多年前,我似乎记得在为跟踪器风格的音乐程序(Jeskola Buzz)编写插件时遇到问题,因为该程序使用的是VC++ 6,而且我已升级到VC++ 7.我不记得确切的问题 - 它可能部分与DLL有关,但我知道那些不需要关心VC++版本.我认为这个问题与提供的.lib文件有关,也可能与它们链接到的运行时库有关.不久之前,所以它有点含糊不清.
无论如何,可以通过MS VC的一个版本编译库++链接到另一个版本构建项目?有什么限制,如果有的话?
我对C和C++库感兴趣,这些库将从C++项目调用(我很少使用C,除了从C++调用的C库).
我试图动态加载C++ DLL,首先我使用"LoadLibrary"函数加载dll并正确处理它的句柄.之后我尝试使用"GetProcAddress"获取DLL文件函数的函数指针,它返回NULL.请找到我的DLL代码并测试应用程序代码,并告诉我代码中出错的地方.
dummy2.h
namespace newer
{
class dllclass
{
public:
static __declspec(dllexport) int run(int a,int b);
};
}
Run Code Online (Sandbox Code Playgroud)
dummy2.cpp
#include <iostream>
using namespace std;
#include "dummy2.h"
namespace newer
{
int dllclass::run(int a,int b)
{
return a+b;
}
}
Run Code Online (Sandbox Code Playgroud)
dummy1.cpp
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
typedef int (*Addition)(int,int);
int _tmain(int argc, _TCHAR* argv[])
{
Addition add;
HINSTANCE hDLL;
hDLL = LoadLibrary(TEXT("Dummy2.dll"));
add = (Addition)GetProcAddress(hDLL, "run");
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请参考上面的代码并指导我.