使用Delphi呼叫C++編寫的DLL

peter1983發表於2008-09-08

1、C++編寫的DLL程式碼如下:

該Dll的功能比較簡單,就是實現一個整數加法;

IAddBase 是一個抽象類,IAdd實現了IAddBase的方法,並採用了單例模式;

GetAddInstance()為dll對外的介面,返回一個IAdd的物件指標;

呼叫者使用該例項就可以呼叫Add方法

  1. class IAddBase
  2. {
  3. public:
  4.    int virtual __stdcall Add(int a, int b) = 0;
  5. };
  6. class IAdd : public IAddBase
  7. {
  8. private:
  9.     static Idd* m_Instance;
  10. protected:
  11.     IAdd(){}
  12.     ~IAdd()
  13.     {
  14.        if (m_Instance != NULL)
  15.           delete m_Instance;
  16.     }
  17. public:
  18.     int __stdcall Add(int a, int b)
  19.     {
  20.         return a + b;
  21.     }
  22.     static IAdd* GetAddInstance()
  23.     {
  24.         if (m_Instance == NULL)
  25.            m_Instance = new Idd();
  26.         return m_Instance;
  27.     }
  28. };
  29. Idd* IAdd::m_Instance = NULL;
  30. extern "C" __declspec(dllexport) IAddBase* GetAddInstance()
  31. {
  32.     return Idd::GetAddInstance();
  33. }

2、在Delphi下呼叫該Dll,這裡採用靜態呼叫方法

  1. //在type中宣告IAddBase,相當於C++中的.h 檔案
  2. Type
  3.   IAddBase = class
  4.   public
  5.     function Add(a, b : Integer):Integer;virtual;stdcall;abstract;
  6.   end;
  7.   function GetAddInstance : IAddBase ; cdecl ; external 'TestAdd.dll';
  8. var
  9.   myAdd : IAddBase;
  10. implemetation
  11. //呼叫IAddBase中的Add方法
  12. function DoAdd(a,b:Integer):Integer;
  13. begin
  14.   myAdd := GetAddInstance;
  15.   result := myAdd.Add(a,b);
  16. end;

3、注意的問題

3.1 dll和delphi 定義的類函式需要宣告為stdcall,有疑問可以Google關鍵字:Delphi C++ stdcall

3.2 函式過載問題

      如果在c++的dll中定義了一個具有相同函式名的類,則在Delphi中無法保證呼叫正確的函式,這裡要指出的是即使在定義時

宣告該函式為overload也無法保證正確呼叫dll中的對應函式

3.3函式定義的順序

    Delphi中定義的類函式的順序必須和C++ .h檔案中定義的類函式順序保持一致,否則呼叫將會出錯。

 

相關文章