Delphi 與 VC 共享接口和對象


我經常會用 Delphi 寫一些工具和應用,為了擴展方便,大部分都會做成插件形式。

迫於某些原因,我的插件不得不用其他開發工具來完成,比如 VC。

於是有個大問題需要解決:如何讓 D 和 VC 互相通信、互相操作。

最普遍的做法,無非是定義一些方法,VC 寫 Dll 導出這些方法,D 載入 Dll 調用。

但問題是稍大點規模的應用,這種方式非常麻煩,也不夠直觀。

於是花了點時間研究 D 和 VC 之間共享接口和對象的一些方法,現將要點共享發布出來,希望對大家有用。

 

基礎事項:

在 D 和 VC 中,要共享的接口、對象中的方法的調用約定必須為 stdcall

 

1. class 的 使用

Delphi 和 VC 中都使用抽象類,將方法都定義為純虛方法,成員的聲明順序請保持一致。

需要注意的是 Delphi 的類方法。一般的靜態類方法在 VC 中直接跳過即可,虛的類方法在 VC 定義為一般的虛函數即可。

 

D:

  TTestObj =  class
   public
     class  procedure Foo;
     procedure Update(Intf: ITestIntf);  virtualstdcallabstract;
     procedure Free;  virtualstdcallabstract;
   end;

 

VC:

class ITestObj
{
public:
     virtual  void __stdcall Update(ITestIntf* pIntf) =  0;
     virtual  void __stdcall Free() =  0;
};

 

2. 接口

D 的 IInterface / IUnknown,在 VC 中定義為 interface /*class*/ : public IUnknown,成員的聲明順序請保持一致

注意,D 中接口支持屬性定義,但是 VC 不支持,因此 D 接口中的屬性定義請放在聲明的最后 

如果接口的實例化是在 VC 中,有點有意思的小細節要注意,詳見后面下載的代碼里的注釋

 

D:

  ITestIntf =  interface
  [ ' {781E6521-8768-4ADA-B843-445ECE548C27} ']
     function  GetText: PAnsiChar;  stdcall;
     procedure SetText(AValue: PAnsiChar);  stdcall;

     function  GetValue: Integer;  stdcall;
     procedure SetValue(AValue: Integer);  stdcall;

     property Text: PAnsiChar  read GetText  write SetText;
     property Value: Integer  read GetValue  write SetValue;
   end;

 

VC:

interface DECLSPEC_UUID( " 781E6521-8768-4ADA-B843-445ECE548C27 ")
ITestIntf :  public IUnknown
{
public:
     virtual LPCSTR __stdcall GetText() =  0
     virtual  void __stdcall SetText(LPCSTR lpszMsg) =  0

     virtual  int __stdcall GetValue() =  0
     virtual  void __stdcall SetValue( int value) =  0
};

 

 

示例代碼中,在 D 里實現了一個接口提供給 VC DLL,在 VC DLL 里實現了一個接口和一個類提供給 D 里使用。

代碼下載

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM