国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

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

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

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

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

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

        精品成人在线观看| 色偷偷88欧美精品久久久| 欧美一级高清大全免费观看| 91精品国产免费| 亚洲欧洲在线观看av| 亚洲五月六月丁香激情| 久久精品国产99| 99久久国产综合精品色伊| 在线成人小视频| 国产精品成人免费在线| 久久www免费人成看片高清| 精品成人在线观看| jiyouzz国产精品久久| 久久蜜桃av一区精品变态类天堂 | 美女mm1313爽爽久久久蜜臀| 波多野结衣亚洲| 亚洲精品国产成人久久av盗摄| 国产在线国偷精品免费看| 欧美午夜精品久久久久久孕妇| 国产日韩欧美一区二区三区乱码| 日韩综合在线视频| 欧洲一区在线观看| 中文字幕制服丝袜成人av | 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 日韩一区有码在线| 日韩一区二区不卡| 成人av网站在线观看免费| 久久久久久一二三区| 在线一区二区三区做爰视频网站| 亚洲国产成人在线| 处破女av一区二区| 欧美国产一区二区在线观看| 在线观看免费亚洲| 国产精品1区2区3区| a美女胸又www黄视频久久| 天天影视色香欲综合网老头| 欧美无人高清视频在线观看| 国产原创一区二区| 天天综合网天天综合色| 亚洲精品久久嫩草网站秘色| 久久久久高清精品| 51精品国自产在线| 久久精品国产第一区二区三区| 国产精品激情偷乱一区二区∴| 日韩视频永久免费| 欧美性大战久久久| 91在线播放网址| 午夜精品一区二区三区免费视频| 久久久久国产免费免费| 日韩欧美卡一卡二| 粉嫩av一区二区三区粉嫩 | 日韩一区和二区| 欧美日韩一区成人| 男女男精品视频网| 国产日产精品1区| 日韩欧美资源站| 欧美高清一级片在线| 欧美三区在线视频| 欧美色精品在线视频| 欧美日韩一区二区不卡| 在线成人免费视频| 欧美美女直播网站| 国产一区二区三区观看| 毛片av一区二区| 久久爱www久久做| 国产美女主播视频一区| 国产乱子轮精品视频| 国内精品免费在线观看| 一区二区三区在线视频观看| 日韩亚洲欧美中文三级| 91精品国产综合久久蜜臀| 91精品国产一区二区人妖| 日韩欧美国产综合一区| 精品久久久久久久久久久久久久久久久| 国产成人夜色高潮福利影视| 亚洲一区二区三区在线播放 | 精品视频一区三区九区| 欧美日韩综合在线免费观看| 欧美伦理视频网站| 日韩女优毛片在线| 亚洲国产岛国毛片在线| 一区二区三区高清不卡| 日本伊人午夜精品| 精品视频1区2区| 欧美一级精品在线| 中文字幕国产精品一区二区| 亚洲免费观看高清| 国产精品天干天干在线综合| 欧美不卡激情三级在线观看| 精品入口麻豆88视频| 亚洲国产成人午夜在线一区| 一区二区在线观看视频| 蜜桃视频在线观看一区| 成人av免费在线| 337p亚洲精品色噜噜噜| 欧美激情一区二区在线| 日韩理论片在线| 国产精品三级久久久久三级| 亚洲精品欧美综合四区| 日本中文字幕一区二区视频 | 中文乱码免费一区二区| 亚洲精品乱码久久久久久| 婷婷综合久久一区二区三区| 国产精品亚洲一区二区三区妖精| 色综合久久九月婷婷色综合| 日韩一级高清毛片| 中文字幕一区二区三区在线不卡| 亚洲成在线观看| 亚洲高清在线视频| 韩国午夜理伦三级不卡影院| 在线中文字幕不卡| 久久精品人人做人人爽97| 久久久久久久久久久久久久久99| 亚洲欧美日韩电影| 国产精品自产自拍| 在线观看91av| 午夜久久久影院| 91老师国产黑色丝袜在线| 日韩欧美高清在线| 亚洲风情在线资源站| 成人h动漫精品| 2021久久国产精品不只是精品| 日韩免费高清av| 一区二区三区中文免费| 国产福利精品导航| 制服丝袜中文字幕一区| 一区二区三区四区精品在线视频| 波多野结衣在线一区| 精品成人在线观看| 老司机精品视频导航| 欧美丰满一区二区免费视频 | 韩国精品主播一区二区在线观看| 色婷婷亚洲一区二区三区| 国产精品久久久久久久久动漫| 精品亚洲免费视频| 粉嫩在线一区二区三区视频| 日韩欧美中文一区| 日韩av中文字幕一区二区| 欧美在线三级电影| 亚洲欧美国产77777| 不卡视频在线看| 亚洲欧美综合网| 91在线云播放| 亚洲精品欧美在线| 91成人看片片| 午夜伦理一区二区| 51午夜精品国产| 紧缚捆绑精品一区二区| 亚洲精品一区二区三区蜜桃下载| 奇米一区二区三区av| 日韩美女主播在线视频一区二区三区| 亚洲成a人片综合在线| 欧美日韩国产大片| 精品一区二区三区免费观看 | 精品久久人人做人人爽| 久久精品国产久精国产| 天天色综合成人网| 日韩久久免费av| 国产毛片精品视频| 中文字幕欧美日韩一区| 91啪亚洲精品| 性欧美大战久久久久久久久| 欧美一区二区人人喊爽| 丁香婷婷综合激情五月色| 亚洲欧美在线另类| 91精品婷婷国产综合久久| 国产在线观看一区二区| 亚洲欧洲中文日韩久久av乱码| 91久久精品一区二区三区| 日本欧美肥老太交大片| 国产午夜精品久久久久久免费视| 成人av手机在线观看| 亚洲午夜电影在线观看| 亚洲精品一区二区三区福利| 91浏览器打开| 韩国三级电影一区二区| 亚洲二区视频在线| 久久精品亚洲麻豆av一区二区 | 国产自产2019最新不卡| 国产精品久久久久久久第一福利| 欧美丝袜丝交足nylons| 国产一区二区三区视频在线播放| 亚洲一区二区三区免费视频| 精品久久99ma| 一本色道久久综合亚洲91| 精品一区二区三区在线观看国产| 日韩理论片一区二区| 欧美成人猛片aaaaaaa| 亚洲精品国产一区二区三区四区在线| 91精品国产综合久久精品性色| 国产激情视频一区二区在线观看| 亚洲资源在线观看| 亚洲国产成人在线| 精品国产制服丝袜高跟| 欧美性感一区二区三区| 91免费观看国产| 国产a视频精品免费观看| 日本伊人精品一区二区三区观看方式| 亚洲欧洲精品天堂一级| 精品久久久三级丝袜|