• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        在Delphi與C++之間完成函數與對象共享

        在Delphi與C++之間完成函數與對象共享

        更新時間:2022-04-30 文章作者:未知 信息來源:網絡 閱讀次數:

        Delphi以其獨特的面向控件的開發方式、強大的數據庫功能以及
        快速的編譯技術,使得它自發布起即格外引人注意。隨著Delphi 3提
        供豐富的Internet應用,Delphi日益成為最重要的軟件開發工具之一,
        它吸引了許多原Visual Basic、Foxpro、dBase甚至C++的程序員,而
        這些程序員使用Delphi時需要解決的一個重要問題就是怎樣利用他們
        原有的代碼。本文將介紹Delphi與C++程序集成的方法,包括:
        S Delphi與C++之間函數的共享;
        S 代碼的靜態鏈接和動態鏈接;
        S 對象的共享。
        函數的共享
        在Delphi中調用C++函數與C++調用Delphi函數相當直接,需要注
        意的是,Delphi 1默認的函數調用方式是Pascal方式,Delphi 2、Delp
        hi 3的默認方式則是優化的cdecl調用方式,即register方式。要在C+
        +與Delphi程序之間實現函數共享,除非有充分的原因,否則應該使用
        標準系統調用方式,即stdcall方式。為了使C++編譯器不將函數標記
        為"mang led",使Delphi編譯器誤認為函數是采用cdecl調用方式,應
        該在C++代碼中,以extern "C "說明被共享的函數,如下例所示:
        原型說明:
        在C++中:
        extern "C" int _stdcall TestFunc();
        在Delphi中:
        function TestFunc:integer; stdcall;
        調用語法:
        在C++中:
        int i=TestFunc();
        在Delphi中:
        var i:integer;

        begin

        i:=TestFunc;

        end;
        共享函數的參數必須是兩種語言都支持的變量類型,這是正確傳
        遞參數的前提。諸如Delphi的currency、string、set等變量類型,在
        C++中沒有相對應的變量類型,不能被用作共享函數的參數。可以用PC
        har類型以值參的方式傳遞字符串指針,這時用戶必須注意字符串空間
        的回收。
        Delphi語言中的變參應被說明成C++中相應變量類型的引用形式,
        如下:
        在Delphi中:
        function TestFunc(var i:integer):integer;
        在C++中:
        int TestFunc(int &i);
        代碼鏈接
        在Delphi與C++之間實現代碼鏈接可采用靜態鏈接或動態鏈接的
        方式。
        1.靜態鏈接方式
        如果C++程序本身的代碼量很小,而且無需擔心與C運行庫會有交
        互過程,一般可選用靜態鏈接方式,即把Delphi與C++的目標文件(*.OB
        J)鏈接成最終的可執行文件。具體的方法是使用{$L}編譯指令,使Del
        phi編譯器自動讀取指定目標文件,說明如下:
        function TestFunc:integer;stdcall;
        {$L TestFunc.OBJ}
        2.動態鏈接方式
        如果C++代碼已經相當全面或自成一個完整的子系統,代碼量很大
        ,或者用到了C運行庫,在這種情況下,應該使用動態鏈接庫(DLL)的方
        式。此時,在兩種語言的源代碼中應做如下說明:
        在C++中:
        int stdcall export TestFunc();
        在Delphi中:
        function TestFunc:integer; stdcall;
        external ‘TestFunc.DLL’;
        對象的共享
        在C++與Delphi之間的對象共享主要體現在對象方法(Method)的
        共享方面,這種共享可分為兩個層次:對象(Object)級共享與類(Class
        )級共享。
        要實現對象級共享,程序設計語言需具備兩個前提條件:
        S 能夠定義指向由另一語言創建的對象的指針;
        S 可以訪問由指針確定的對象中的方法。
        要實現類級的共享,則還需考慮:
        S 能夠創建由另一種語言定義的類的實例;
        S 可以從堆中釋放一個實例所占用的空間;
        S 派生新的類。
        以下介紹在Delphi與Borland C++之間實現對象共享的方法。
        1.C++共享Delphi對象
        要實現從C++調用Delphi對象,首先要在Delphi單元的接口部分以
        及C++的頭文件中說明需要共享的對象的接口,在對象接口中定義該對
        象包含哪些屬性與方法,并說明可供共享的部分。對象的共享,關鍵在
        于方法的共享。在Delphi語言中,要使一個對象可以被共享,可以把它
        說明為兩個接口部分,暫稱為"共享接口"與"實現接口"。其中共享接
        口指明對象中哪些方法可被另一種語言所共享;實現接口則繼承共享
        接口,并且在單元實現部分針對實現接口中的方法定義具體的實現。
        要定義一個可供C++共享的Delphi對象,共享接口的說明應注意:
        S 在Delphi程序里,要共享的方法必須被說明為抽象(abstract),
        而且虛擬(virtual );
        S 在C++程序里,必須用關鍵字"virtual"及"=0"后綴,把從Delphi
        共享的方法說明成"pure virtual";
        S 共享的對象方法必須在兩種語言里都被說明成相同的調用方式
        ,通常使用標準系統調用方式(stdcall)。
        下面,舉例說明這些規則,假設有這樣的一個Delphi對象:
        TTestObject=class
        procedure Proc1(x:integer);
        function Func1(x:integer):PChar;
        procedure Proc2;
        function Func2:integer;
        end;
        如果C++程序需要共享其中的方法Proc1、Func1,可把上述說明修
        改成以下形式:
        STestObject=class
        procedure Proc1(x:integer); virtual; abstract; stdcall;
        function Func1(x:integer); virtual; abstract; stdcall;
        end;
        TTestObject=class(STestObject)
        procedure Proc1(x:integer);
        fuction Func1(x:integer):PChar;
        procedure Proc2;
        fuction Func2:integer;
        end;
        在C++程序中做如下對象原型說明:
        class STestObject {
        virtual void Proc1(int x)=0;
        virtual char *Func1(int x)=0;
        };
        為了能在C++中成功地訪問Delphi定義的類, Delphi接口說明時
        必須包含一個可共享的"制造函數(Factory Function)"CreateTestOb
        ject,該制造函數可被定義在動態鏈接庫或目標文件(.OBJ)中,例如:
        Library TestLib;
        exports CreateTestObject;
        function CreateTestObject:STestObject; stdcall;
        begin
        Result:=TTestObject.Create;
        end;

        end.
        經過這樣的處理,現在可在C++程序中使用這個由Delphi定義的對
        象,調用方式如下:
        extern "C" STestObject stdcall *CreateTestObject();
        void UseTestObject(void) {
        STestObject *theTestObject=CreateTestObject();
        theTestObject->Proc1(10);
        Char *str=theTestObject->Func1(0);
        }
        當調用制造函數CreateTestObject時,實際上已經在Delphi一側
        占用了一個對象實例的空間,C++程序在針對該對象的所有處理完成后
        必須考慮釋放這一空間,具體的實現可在Delphi中定義一個類,如上述
        Proc1的共享方法Free,以此來完成這一任務:
        STestObject=class
        procedure Proc1(x:integer); virtual; abstract; stdcall;
        function Func1(x:integer); virtual; abstract; stdcall;
        procedure Free; virtual; abstract; stdcall;
        end;

        implementation

        procedure TTestObject.Free;
        begin

        end;

        end.
        2.Delphi共享C++對象
        通常,程序員會考慮使用Delphi來編制用戶界面,所以Delphi代碼
        調用C++代碼似乎顯得更加實際些。其實,Delphi共享C++對象的實現
        方法與上述C++共享Delphi對象非常相似。
        用同樣的共享接口與實現接口說明方法來定義C++的類:
        class STestObjedt {
        virtual void Proc1(int x)=0;
        virtual char *Func1(int x)=0;
        };
        class TTestObjedt :public STestObject {
        void Proc1(int x);
        char *Func1(int x);
        void Proc2();
        int Func2();
        void Free();
        };
        然后實現這些方法。同樣地,C++對象需要一個與之對應的制造函
        數,這里以DLL為例
        STestObject stdcall export *CreateTestObject() {
        return (STestObject *) new TTestObject.Create;
        }
        Delphi代碼可以通過調用制造函數CreateTestObject,很容易地
        在C++中創建實例,獲得指向該實例的指針值,并以這個指針值來調用
        對象中的共享方法。當然,在進行完該對象的相關處理后,千萬不要忘
        了調用Free釋放占用的空間。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 亚洲第一精品福利| 久久精品国产亚洲一区二区| 日韩亚洲国产高清免费视频| 成人浮力影院免费看| 亚洲老熟女@TubeumTV| 4444www免费看| 亚洲一本之道高清乱码| 国产又黄又爽又猛免费app| 亚洲伦理中文字幕| 好吊妞在线新免费视频| www亚洲精品久久久乳| 免费成人午夜视频| 免费人成大片在线观看播放| 亚洲午夜无码久久久久| 国产精品免费观看调教网| 亚洲成人免费在线| 日韩免费一区二区三区在线播放| 亚洲精品视频观看| 日韩黄色免费观看| 一级做受视频免费是看美女| 亚洲AV无码成人精品区在线观看| 最近2019免费中文字幕6| 亚洲已满18点击进入在线观看| 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | a级毛片毛片免费观看久潮喷| 亚洲av色福利天堂| 国产一精品一AV一免费孕妇| 国产产在线精品亚洲AAVV| 亚洲区小说区激情区图片区| 日韩精品免费一级视频| 亚洲第一se情网站| 国产精一品亚洲二区在线播放| 在线看片韩国免费人成视频| 黄人成a动漫片免费网站| 亚洲AV永久无码区成人网站| 女人毛片a级大学毛片免费| 羞羞视频在线观看免费| 精品亚洲成AV人在线观看| 国产免费看插插插视频| 日韩精品无码一区二区三区免费 | 亚洲不卡在线观看|