繁体   English   中英

指向和指向DLL的指针

[英]Pointers in and out of DLLs

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

我已经阅读了这篇文章http://msdn.microsoft.com/zh-cn/library/ms235460.aspx但这似乎并没有给我带来什么帮助。 也许我误会了...

是的,这很好,但是假设您的DLL已动态分配了缓冲区所指向的数据,则在释放它时必须小心。 有几种方法可以解决此问题:

  • DLL记录了一种方法,通过该方法可以释放数据(即CoTaskFree)
  • DLL公开了一个应调用的函数,以后可以释放数据
  • DLL和调用者使用的是基于DLL的公共运行时。 这允许调用者使用C ++ delete运算符

是。

假设您使用Microsoft Visual Studio作为开发环境,则可以直接从dll中导出类。 向您的dll项目中添加一个定义,例如BUILDING_THE_DLL ,下面的代码片段将从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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM