簡體   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