亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

在Delphi與C++之間實現函數與對象共享 

2019-09-06 23:33:42
字體:
來源:轉載
供稿:網友

                      在Delphi中調用C++函數與C++調用Delphi函數相當直接,需要注
意的是,Delphi 1默認的函數調用方式是Pascal方式,Delphi 4、Delphi
5的默認方式則是優化的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++中沒有相對應的變量類型,不能被用作共享函數的參數???br/>以用PChar類型以值參的方式傳遞字符串指針,這時用戶必須注意字符
串空間的回收。
  Delphi語言中的變參應被說明成C++中相應變量類型的引用形式,
如下:在Delphi中:function TestFunc(var i:integer):integer;在C++
中:int TestFunc(int &i);代碼鏈接在Delphi與C++之間實現代碼鏈
接可采用靜態鏈接或動態鏈接的方式。
  1.靜態鏈接方式如果C++程序本身的代碼量很小,而且無需擔心與C
運行庫會有交互過程,一般可選用靜態鏈接方式,即把Delphi與C++的
目標文件(*.OBJ)鏈接成最終的可執行文件。具體的方法是使用{$L}
編譯指令,使Delphi編譯器自動讀取指定目標文件,說明如下: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)級共享。要實現對象級共享,程序設計語言需具備
兩個前提條件:能夠定義指向由另一語言創建的對象的指針;可以訪問
由指針確定的對象中的方法。
  要實現類級的共享,則還需考慮:能夠創建由另一種語言定義的類
的實例;可以從堆中釋放一個實例所占用的空間;派生新的類。
  以下介紹在Delphi與Borland C++之間實現對象共享的方法。
  1.C++共享Delphi對象要實現從C++調用Delphi對象,首先要在Delphi
單元的接口部分以及C++的頭文件中說明需要共享的對象的接口,在對
象接口中定義該對象包含哪些屬性與方法,并說明可供共享的部分。
對象的共享,關鍵在于方法的共享。在Delphi語言中,要使一個對象可
以被共享,可以把它說明為兩個接口部分,暫稱為"共享接口"與"實現
接口"。其中共享接口指明對象中哪些方法可被另一種語言所共享;實
現接口則繼承共享接口,并且在單元實現部分針對實現接口中的方法
定義具體的實現。要定義一個可供C++共享的Delphi對象,共享接口的
說明應注意:在Delphi程序里,要共享的方法必須被說明為抽象(abstract),
而且虛擬(virtual );在C++程序里,必須用關鍵字"virtual"及"=0"后
綴,把從Delphi共享的方法說明成"pure virtual";共享的對象方法必
須在兩種語言里都被說明成相同的調用方式,通常使用標準系統調用
方式(stdcall)。
  下面,舉例說明這些規則,假設有這樣的一個Delphi對象:TTestObject=classprocedure
Proc1(x:integer);function Func1(x:integer):PChar;procedure
Proc2;function Func2:integer;end;如果C++程序需要共享其中的
方法Proc1、Func1,可把上述說明修改成以下形式:
STestObject=classprocedure
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)"CreateTestObject,
該制造函數可被定義在動態鏈接庫或目標文件(.OBJ)中,例如:Library
TestLib;exports CreateTestObject;function CreateTestObject:STestObject;
stdcall;beginResult:=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=classprocedure 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釋放占用的空間。
上一篇:返回列表

下一篇:用Delphi控制IE窗口

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩国产中文| 亚洲毛片在线免费观看| 亚洲一区二区三区视频| 欧美日韩国产精品一区二区三区四区| 欧美成人精品在线| 麻豆国产va免费精品高清在线| 国产97在线观看| 亚洲综合成人婷婷小说| 精品久久久久久久久久ntr影视| 亚洲国产一区二区三区四区| 国产精品美女久久久免费| 日韩美女毛茸茸| 国内外成人免费激情在线视频网站| 精品福利在线视频| 国产精品久久久久久久电影| 丁香五六月婷婷久久激情| 欧美肥老妇视频| 色视频www在线播放国产成人| 黑人巨大精品欧美一区二区三区| 欧美日韩一区二区精品| 国产精品久久久久久超碰| 久久激情视频久久| 欧美精品免费在线观看| 92国产精品久久久久首页| 国产97免费视| 国产视频丨精品|在线观看| 俺去亚洲欧洲欧美日韩| 亚洲奶大毛多的老太婆| 欧美日韩精品在线观看| 亚洲激情在线观看| 国产一区二区动漫| 亚洲欧美精品中文字幕在线| 国产精品欧美一区二区三区奶水| 亚洲国产高清高潮精品美女| 中文字幕一精品亚洲无线一区| 狠狠综合久久av一区二区小说| 欧美高跟鞋交xxxxhd| 亚洲无限av看| 日韩精品久久久久久久玫瑰园| 亚洲精品一区久久久久久| 亚洲xxxx做受欧美| 国产精品亚洲综合天堂夜夜| 久久99久久久久久久噜噜| 国产精品视频色| 欧美影院成年免费版| 亚洲精品suv精品一区二区| 日韩av在线免费看| 欧美黑人xxx| 在线精品国产成人综合| 丝袜美腿精品国产二区| 亚洲在线www| 欧美性极品xxxx做受| 欧美激情精品久久久久久免费印度| 欧美性xxxxx| 日韩欧美亚洲一二三区| 成人黄色av播放免费| 国产91在线播放九色快色| www国产精品视频| 日韩国产欧美精品一区二区三区| 精品自在线视频| 亚洲精品国产精品久久清纯直播| 亚洲电影成人av99爱色| 欧美美女15p| 国产精品美乳在线观看| 国产精品爽黄69| 最近的2019中文字幕免费一页| 中文字幕成人精品久久不卡| 美女av一区二区| 欧美xxxwww| 亚洲已满18点击进入在线看片| 国产精品伦子伦免费视频| 伊人伊成久久人综合网小说| 精品国内产的精品视频在线观看| 疯狂做受xxxx欧美肥白少妇| 亚洲国产精品高清久久久| 国产成人精品久久| 日韩成人激情视频| 日韩av手机在线看| 国产有码一区二区| 亚洲精品二三区| 国产精品劲爆视频| 亚洲最大成人网色| 日韩h在线观看| 日韩电影中文字幕| 91精品久久久久| 91精品国产91久久久久久最新| 一本一道久久a久久精品逆3p| 亚洲精品成人av| 国产99久久精品一区二区 夜夜躁日日躁| 国产午夜精品免费一区二区三区| 国产精品吹潮在线观看| 国产亚洲免费的视频看| 国产精品美女免费| 久久天天躁狠狠躁夜夜av| 97精品视频在线播放| 欧美日韩亚洲激情| 欧美日韩亚洲视频| 亚洲剧情一区二区| 久久精品中文字幕电影| 欧美一级淫片播放口| 51久久精品夜色国产麻豆| 一区二区三区黄色| 国产一区二区三区在线视频| 亚洲精品国产精品国产自| 亚洲精品国产免费| 国产欧美一区二区三区在线看| 最新69国产成人精品视频免费| 色综合视频一区中文字幕| 国产激情久久久久| 久久视频国产精品免费视频在线| 97色在线视频观看| 97激碰免费视频| 欧美猛男性生活免费| 国产91在线高潮白浆在线观看| 国产一区二区三区三区在线观看| 亚洲偷熟乱区亚洲香蕉av| 国产丝袜一区视频在线观看| 91精品综合久久久久久五月天| 91免费看视频.| 色综合亚洲精品激情狠狠| 欧美日韩国产123| 亚洲欧洲在线免费| 日韩激情视频在线| 日韩中文字幕网址| 中文字幕日韩高清| 亚洲香蕉成人av网站在线观看| 久久精品成人欧美大片古装| 91精品在线观| 午夜欧美不卡精品aaaaa| 97在线观看视频| 国产欧美一区二区三区久久人妖| 久久91亚洲精品中文字幕奶水| 国产精品自在线| 亚洲自拍小视频免费观看| 国产精品丝袜久久久久久高清| 91网站在线看| 国产精品一二区| 国产精品一二三在线| 日韩精品免费在线视频| 日韩在线观看电影| 久久久久九九九九| 成人黄色av播放免费| 亚洲福利在线播放| 亚洲成色777777女色窝| 日韩av网站导航| 日韩欧美aⅴ综合网站发布| 日本免费一区二区三区视频观看| 色婷婷久久av| 国产美女高潮久久白浆| 国产成人涩涩涩视频在线观看| 韩国国内大量揄拍精品视频| 亚洲成人精品视频在线观看| 高跟丝袜一区二区三区| 国产a∨精品一区二区三区不卡| 欧美性受xxxx黑人猛交| 国产热re99久久6国产精品| 亚洲欧美日韩另类| 中文字幕av一区中文字幕天堂| www日韩中文字幕在线看| 国产精品综合网站| 国产午夜精品免费一区二区三区| 亚洲欧美综合图区| 欧美高跟鞋交xxxxxhd| 亚洲国产成人精品久久久国产成人一区|