• <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釋放占用的空間。

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

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 亚洲精品免费观看| 亚洲午夜福利717| 亚洲一级毛片免费看| 午夜理伦剧场免费| 麻豆亚洲AV永久无码精品久久| 成人网站免费看黄A站视频| 亚洲精品无码专区久久久| 99视频在线观看免费| 亚洲精品在线观看视频| 在免费jizzjizz在线播| 亚洲中文久久精品无码1| 无码高潮少妇毛多水多水免费| 亚洲欧美日韩综合久久久| 精品国产免费观看久久久| 国产成人综合亚洲| 亚洲人精品午夜射精日韩| 无码人妻一区二区三区免费看| 亚洲国产精品成人久久久| 免费激情视频网站| 深夜免费在线视频| 亚洲av无码无在线观看红杏| 最近中文字幕无免费| 国产成人精品日本亚洲专区6| 日韩视频在线免费| 美女被免费网站91色| 亚洲四虎永久在线播放| 成人特黄a级毛片免费视频| 国产AV日韩A∨亚洲AV电影| 亚洲精品无码专区在线在线播放| 24小时免费看片| 久久精品国产亚洲AV| 亚洲国产精品无码专区影院| 青草草色A免费观看在线| 免费的黄网站男人的天堂| 亚洲AV日韩AV永久无码免下载| 99久久这里只精品国产免费| 免费一区二区三区在线视频| 亚洲美女aⅴ久久久91| 国产免费av片在线播放| 久久久久成人片免费观看蜜芽| 亚洲综合一区无码精品|