Windows 指针进出DLL
是否可以将指向对象的指针传递到DLL中,对其进行初始化,然后在主应用程序中使用初始化的指针?如果是,怎么做?有关于这个主题的好文章吗,也许是教程 我读过这篇文章,但这篇文章似乎没有给我任何帮助。也许我误解了…是的 假设您使用Microsoft Visual Studio作为开发环境,则可以直接从dll导出类。向DLL项目添加一个定义,如“代码> BuffugIdIODLL< /Cord>”,下面的代码片段将从DLL中批发C++类。Windows 指针进出DLL,windows,dll,winapi,pointers,Windows,Dll,Winapi,Pointers,是否可以将指向对象的指针传递到DLL中,对其进行初始化,然后在主应用程序中使用初始化的指针?如果是,怎么做?有关于这个主题的好文章吗,也许是教程 我读过这篇文章,但这篇文章似乎没有给我任何帮助。也许我误解了…是的 假设您使用Microsoft Visual Studio作为开发环境,则可以直接从dll导出类。向DLL项目添加一个定义,如“代码> BuffugIdIODLL< /Cord>”,下面的代码片段将从DLL中批发C++类。 #ifdef BUILDING_THE_DLL #define
#ifdef BUILDING_THE_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
class EXPORT DllClass
{
....
};
这是一个高度耦合的解决方案,仅当您使用相同的开发环境构建应用程序及其dll,并在类定义以任何方式更改时重新构建两者时,此解决方案才有效。MFC库大量使用此方法
为了在dll和应用程序之间实现更大的独立性,通常会定义一个相对不可变的接口,并使用该接口使构建更加独立,并可能使用不同的构建环境
dll中的实现如下所示:
struct IMyInterface {
virtual void Destroy() =0;
virtual void Method() = 0;
};
class MoDllObject : public IMyInterface
{
// implementation
};
bool EXPORT DllGetInterface(IMyInterface** ppOut)
{
*ppOut = new MyDllObject();
return true;
}
对
假设您使用Microsoft Visual Studio作为开发环境,则可以直接从dll导出类。向DLL项目添加一个定义,如“代码> BuffugIdIODLL< /Cord>”,下面的代码片段将从DLL中批发C++类。
#ifdef BUILDING_THE_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
class EXPORT DllClass
{
....
};
这是一个高度耦合的解决方案,仅当您使用相同的开发环境构建应用程序及其dll,并在类定义以任何方式更改时重新构建两者时,此解决方案才有效。MFC库大量使用此方法
为了在dll和应用程序之间实现更大的独立性,通常会定义一个相对不可变的接口,并使用该接口使构建更加独立,并可能使用不同的构建环境
dll中的实现如下所示:
struct IMyInterface {
virtual void Destroy() =0;
virtual void Method() = 0;
};
class MoDllObject : public IMyInterface
{
// implementation
};
bool EXPORT DllGetInterface(IMyInterface** ppOut)
{
*ppOut = new MyDllObject();
return true;
}
是的,这很好,但是假设您的DLL动态分配了缓冲区指向的数据,您必须小心如何释放它。有几种方法可以解决这个问题:
- DLL记录了一种释放数据的方法(即CoTaskFree)
- DLL公开了一个函数,以后应该调用该函数来释放数据
- DLL和调用方使用基于DLL的公共运行时;这允许调用方使用C++删除运算符< /LI>。
- DLL记录了一种释放数据的方法(即CoTaskFree)
- DLL公开了一个函数,以后应该调用该函数来释放数据
- DLL和调用方使用基于DLL的公共运行时;这允许调用方使用C++删除运算符< /LI>。