Windows 指针进出DLL

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

是否可以将指向对象的指针传递到DLL中,对其进行初始化,然后在主应用程序中使用初始化的指针?如果是,怎么做?有关于这个主题的好文章吗,也许是教程

我读过这篇文章,但这篇文章似乎没有给我任何帮助。也许我误解了…

是的

假设您使用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;
}

假设您使用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已动态分配缓冲区指向的数据,则必须小心如何释放它。有几种方法可以解决这个问题:

  • DLL记录了一种释放数据的方法(即CoTaskFree)
  • DLL公开了一个函数,以后应该调用该函数来释放数据
  • DLL和调用方使用基于DLL的公共运行时;这允许调用方使用C++删除运算符< /LI>。
为什么这与在“内部”函数中初始化指针有什么不同?我能想到的唯一不同之处可能是地址空间。DLL是否使用与其父应用程序/调用应用程序不同的堆。(我确实意识到这种实现没有多大意义。)为什么这与在“内部”函数中初始化指针有什么不同?我能想到的唯一不同的可能是地址空间。DLL是否使用与其父应用程序/调用应用程序不同的堆。(我确实意识到这种实施没有多大意义。)