DelphiのC ++関数を呼び出すことは、非常に直接的であり、C ++でDelphi関数を呼び出します
Delphi 1のデフォルト関数呼び出し方式はPascal Method、Delphi 4、Delphiが
5のデフォルトメソッドは、最適化されたCDECLコールメソッド、つまりレジスタメソッドです。 C ++にいること
十分な理由がない限り、Delphiプログラムで機能共有を実装する必要があります。標準を使用する必要があります。
ベアシステムコールメソッド、つまりstdcallメソッド。 C ++コンパイラが関数を「マン」としてマークしないようにするために
LED」、Delphiコンパイラがこの関数がCDECLコールメソッドを使用していると誤って信じていると信じています。
コードでは、次の例に示すように、extern "c"は共有関数を説明しています:プロトタイプ説明:in c ++
In:extern "c" int _stdcall testfunc();
stdcall; call syntax:in c ++:int i = testfunc();
Delphi:var i:integer;…
始める…
i:= testfunc;…
終了;共有関数のパラメーターは、両方の言語でサポートされる変数タイプでなければなりません。これは正しいものです。
パラメーターを渡すための前提条件。 Delphiの通貨、文字列、セットなどの変動クラス。
タイプ、C ++では、対応する変数タイプはなく、共有関数のパラメーターとして使用することはできません。できる
PCHARタイプを使用して、値パラメーターを備えた文字列ポインターをパスします。
文字列スペースのリサイクル。
Delphi言語の変数パラメーターは、C ++の対応する変数タイプの参照形式として説明する必要があります。
次のように:Delphi:function testfunc(var i:integer):integer;
In:int testfunc(int&i);コードリンクは、DelphiとC ++の間のコードリンクを実装しています
接続は、静的リンクまたは動的リンクによって実行できます。
1. C ++プログラム自体に少量のコードがあり、Cについて心配する必要がない場合は、静的リンク方法
ランタイムライブラリにはインタラクティブなプロセスがあり、静的リンク方法、つまりDelphiとC ++を使用できます。
オブジェクトファイル(*.OBJ)は、最終実行可能ファイルにリンクされています。特定の方法は{$ l}を使用することです
以下に説明するように、Delphiコンパイラが指定されたターゲットファイルを自動的に読み取ることができるように手順をコンパイルします。
testfunc:integer; stdcall; {$ l testfunc.obj} 2は次のとおりです
C ++コードがすでに非常に包括的または完全なサブシステムである場合、コードボリュームは大きい、または
Cランタイムライブラリを使用する場合、この場合、動的リンクライブラリ(DLL)メソッドを使用する必要があります。これ
いつ、次の説明を2つの言語のソースコードで行う必要があります:in c ++:int stdcallエクスポート
testfunc();
'testfunc.dll';
現在、オブジェクトメソッドを共有するという点で、この共有は2つのレベルに分類できます。オブジェクト(オブジェクト)
クラスの共有とクラス共有。オブジェクトレベルの共有を実装するには、プログラミング言語が必要です
2つの前提条件:別の言語によって作成されたオブジェクトへのポインターを定義できます
ポインターによって決定されるオブジェクト内のメソッド。
クラスレベルの共有を実装するには、別の言語で定義されたクラスを作成できることも考慮する必要があります
インスタンスによって占有されているスペースは、新しいクラスを解放できます。
以下は、DelphiとBorland C ++の間でオブジェクト共有を実装する方法について説明します。
1。C++でDelphiオブジェクトを共有するには、C ++からDelphiオブジェクトのコールを実装するには、最初にDelphiを使用する必要があります
ユニットのインターフェイス部分とC ++ヘッダーファイルは、共有する必要があるオブジェクトのインターフェイスを示しています。
オブジェクトインターフェイスは、オブジェクトに含まれるプロパティとメソッドを定義し、共有できる部分を説明します。
オブジェクトの共有の鍵は、方法を共有することにあります。 Delphi言語では、オブジェクトを有能にします
共有するために、「共有インターフェイス」と「実装と一時的に呼ばれる2つのインターフェイスパーツとして説明できます
インターフェイス "。共有インターフェイスは、オブジェクト内のどのメソッドを別の言語で共有できるかを示します。
現在のインターフェイスは共有インターフェイスを継承し、ユニットの実装部分のメソッドを使用してインターフェイスを実装します。
特定の実装を定義します。 C ++で共有できるDelphiオブジェクトを定義するには、共有インターフェイス
注:Delphiプログラムでは、共有する方法は抽象的(要約)として説明する必要があります。
virtual(virtual); c ++プログラムでは、キーワード「virtual」と「= 0」を使用する必要があります。
共有オブジェクトメソッドは、Delphiによって「純粋な仮想」として説明する必要があります。
通常、標準のシステム呼び出しを使用して、両方の言語で同じ呼び出し方法として説明する必要があります
方法(stdcall)。
以下に、このようなDelphiオブジェクトがあると仮定して、これらのルールの例を挙げましょう:ttestobject = classprocedure
proc1(x:integer); function func1(x:integer):pchar; procedure
proc2; function func2:integer; end; c ++プログラムが共有する必要がある場合
メソッドProc1およびFunc1は、次の形式に変更できます。
stestobject = classprocedure
proc1(integer);
stdcall; function func1(x:integer);
Virtual; abstdcall; ttestobject = class(stestobject)手順
proc1(x:integer); fuction func1(x:integer):pchar;
手順proc2;関数
func2:integer; end;
{仮想void proc1(int x)= 0; virtual char *func1(int x)= 0;};
C ++でDelphi定義のクラスに正常にアクセスするには、Delphiインターフェイスを指定する必要があります。
共有可能な「工場関数」CreateTeStObjectが含まれています。
製造機能は、動的リンクライブラリまたはオブジェクトファイル(.OBJ)で定義できます。たとえば、ライブラリ
testlib; exports createTestObject; function createTeStObject:stestObject;
stdcall:= ttestobject.create;…
そのような処理の後、これはDelphiによって定義されたC ++プログラムで使用できます
呼び出しのオブジェクトは次のとおりです:extern "c" stestobject stdcall
*createTestObject(); void
usetestobject(void){stestobject *thetestobject = createTobject();
*str = thetestobject-> func1(0);}製造機能CreateTeStObjectを呼び出すとき
Delphi側が実際にオブジェクトインスタンスのスペースを占有したとき、C ++プログラムは
このオブジェクトのすべての処理が完了した後、特定の実装を解放する必要があります
これを完了するために、上記のproc1が含まれていない共有方法など、Delphiのクラスを定義します
1つのタスク:stestobject = classprocedure proc1(x:integer);
要約; func1(x:integer);
stdcall; abstdcall;
実装…
手順ttestobject.free;
終わり;…
end.2.delphi共有C ++オブジェクト通常、プログラマーはDelphiを使用してコンパイルすることを検討します。
ユーザーインターフェイスなので、DelphiコードはC ++コードを呼び出します。実際、デルフィ
C ++オブジェクトを共有する実装方法は、上記のC ++共有Delphiオブジェクトと非常に似ています。同じものを使用します
共有インターフェイスと実装インターフェイス説明C ++クラスを定義する方法:クラスStestObject
{仮想void proc1(int x)= 0; virtual char *func1(int x)= 0;}; class
ttestObject:public stestobject {void proc1(int x); char *func1(int
x); void proc2(); int func2(); void free();};
。同様に、C ++オブジェクトには、対応する製造機能が必要です
stdcall export *createtestobject(){return(stestobject *)
new ttestobject.create;} delphiコードを使用して、createToBjectを呼び出すことにより、createTeStObjectを作成することができます。
C ++でインスタンスを作成し、そのインスタンスのポインター値を取得し、このポインターを使用するのは簡単です
オブジェクト内の共有メソッドを呼び出す価値。もちろん、オブジェクトの関連する処理を完了した後、
自由に電話して、占有されているスペースを自由にすることを忘れないでください。