2009-09-07 60 views
0

是否可以將指向對象的指針傳遞給DLL,初始化它,然後在主應用程序中使用初始化的指針?如果是這樣如何?有沒有關於這個主題的好文章,也許是一個教程?進出DLL的指針

我已閱讀此文http://msdn.microsoft.com/en-us/library/ms235460.aspx但這似乎並沒有讓我在任何地方。也許我誤解了它......

+0

爲什麼這與初始化「內部」函數中的指針有什麼不同? – schmrz 2009-09-07 17:54:35

+0

我能想到的唯一事情就是使地址空間不同。 DLL是否使用與其父應用程序/調用應用程序不同的堆? (我確實意識到這種實現並不合理。) – Chezz 2009-09-07 18:11:27

回答

3

是的,這是好的,但假設你的DLL動態地分配數據由指向的緩衝區,你必須小心如何你釋放它。有幾種方法來處理這個:

  • 的DLL記錄了由哪一個應該釋放數據的方法(即CoTaskFree)
  • 該DLL公開一個應該被調用後釋放數據功能
  • 該DLL和調用者正在使用一個基於DLL的公共DLL;這使得調用者可以使用C++刪除操作符
0

是的。

假設您使用Microsoft Visual Studio作爲您的開發環境,您可以直接從dll導出類。添加一個定義到您的dll項目,如BUILDING_THE_DLL和下面的代碼snippit將從dll導出一個C++類批發。

#ifdef BUILDING_THE_DLL 
#define DLLEXPORT __declspec(dllexport) 
#else 
#define DLLEXPORT __declspec(dllimport) 
#endif 

class EXPORT DllClass 
{ 
.... 
}; 

這是一個高度耦合的解決方案,如果你構建應用程序,並使用相同的開發環境的DLL,並重建只能每次都以任何方式類定義的變化。這個方法被MFC庫重用。

爲了實現dll和app之間更大的獨立性,通常會定義一個相對不可變的接口,並使用它來使構建更加獨立,並可能使用不同的構建環境。

在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; 
}