⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcb_a17.htm

📁 C++Builder教学大全
💻 HTM
字号:
 

<html>

<head>

<title>C++Builder编程文集</title>

<meta http-equiv="目录类型" content="文本/html; 字符集=gb2312">

<link rel="stylesheet" href="../bcbget.myric/Css.css" tppabs="http://bcbget.myrice.com/Css.css">

</head>

<body bgcolor="#FFFFFF">

<table width="100%" border="0" height="285">

  <tr> 

    <td height="35"> 

      <div align="center" class="p14"><font color="#000000">在Delphi与C++之间实现函数与对象共享</font></div>

    </td>

  </tr>

  <tr valign="top"> 

    <td> 

      <p> <font color="#000000">  张维<br>

        在Delphi中调用C++函数与C++调用Delphi函数相当直接,需要注<br>

        意的是,Delphi 1默认的函数调用方式是Pascal方式,Delphi 4、Delphi<br> 

        5的默认方式则是优化的cdecl调用方式,即register方式。要在C++<br> 

        与Delphi程序之间实现函数共享,除非有充分的原因,否则应该使用标<br> 

        准系统调用方式,即stdcall方式。为了使C++编译器不将函数标记为&quot;mang<br> 

        led&quot;,使Delphi编译器误认为函数是采用cdecl调用方式,应该在C++<br> 

        代码中,以extern &quot;C &quot;说明被共享的函数,如下例所示:原型说明:在C++<br> 

        中:extern &quot;C&quot; int _stdcall TestFunc();在Delphi中:function TestFunc:integer;<br> 

        stdcall;调用语法:在C++中:int i=TestFunc();<br> 

        在Delphi中:var i:integer;…<br> 

        begin…<br>

        i:=TestFunc;…<br>

        end;共享函数的参数必须是两种语言都支持的变量类型,这是正<br>

        确传递参数的前提。诸如Delphi的currency、string、set等变量类<br>

        型,在C++中没有相对应的变量类型,不能被用作共享函数的参数。可<br>

        以用PChar类型以值参的方式传递字符串指针,这时用户必须注意字符<br>

        串空间的回收。<br>

        Delphi语言中的变参应被说明成C++中相应变量类型的引用形式,<br>

        如下:在Delphi中:function TestFunc(var i:integer):integer;在C++<br> 

        中:int TestFunc(int &amp;i);代码链接在Delphi与C++之间实现代码链<br> 

        接可采用静态链接或动态链接的方式。<br> 

        1.静态链接方式如果C++程序本身的代码量很小,而且无需担心与C<br>

        运行库会有交互过程,一般可选用静态链接方式,即把Delphi与C++的<br>

        目标文件(*.OBJ)链接成最终的可执行文件。具体的方法是使用{$L}<br>

        编译指令,使Delphi编译器自动读取指定目标文件,说明如下:function<br>

        TestFunc:integer;stdcall;{$L TestFunc.OBJ}2.动态链接方式如<br> 

        果C++代码已经相当全面或自成一个完整的子系统,代码量很大,或者<br> 

        用到了C运行库,在这种情况下,应该使用动态链接库(DLL)的方式。此<br> 

        时,在两种语言的源代码中应做如下说明:在C++中:int stdcall export<br> 

        TestFunc();在Delphi中:function TestFunc:integer; stdcall;external<br> 

        'TestFunc.DLL';对象的共享在C++与Delphi之间的对象共享主要体<br> 

        现在对象方法(Method)的共享方面,这种共享可分为两个层次:对象(Object)<br> 

        级共享与类(Class)级共享。要实现对象级共享,程序设计语言需具备<br> 

        两个前提条件:能够定义指向由另一语言创建的对象的指针;可以访问<br> 

        由指针确定的对象中的方法。<br> 

        要实现类级的共享,则还需考虑:能够创建由另一种语言定义的类<br>

        的实例;可以从堆中释放一个实例所占用的空间;派生新的类。<br>

        以下介绍在Delphi与Borland C++之间实现对象共享的方法。<br> 

        1.C++共享Delphi对象要实现从C++调用Delphi对象,首先要在Delphi<br>

        单元的接口部分以及C++的头文件中说明需要共享的对象的接口,在对<br>

        象接口中定义该对象包含哪些属性与方法,并说明可供共享的部分。<br>

        对象的共享,关键在于方法的共享。在Delphi语言中,要使一个对象可<br>

        以被共享,可以把它说明为两个接口部分,暂称为&quot;共享接口&quot;与&quot;实现<br>

        接口&quot;。其中共享接口指明对象中哪些方法可被另一种语言所共享;实<br>

        现接口则继承共享接口,并且在单元实现部分针对实现接口中的方法<br>

        定义具体的实现。要定义一个可供C++共享的Delphi对象,共享接口的<br>

        说明应注意:在Delphi程序里,要共享的方法必须被说明为抽象(abstract),<br>

        而且虚拟(virtual );在C++程序里,必须用关键字&quot;virtual&quot;及&quot;=0&quot;后<br> 

        缀,把从Delphi共享的方法说明成&quot;pure virtual&quot;;共享的对象方法必<br> 

        须在两种语言里都被说明成相同的调用方式,通常使用标准系统调用<br> 

        方式(stdcall)。<br> 

        下面,举例说明这些规则,假设有这样的一个Delphi对象:TTestObject=classprocedure<br>

        Proc1(x:integer);function Func1(x:integer):PChar;procedure<br> 

        Proc2;function Func2:integer;end;如果C++程序需要共享其中的<br> 

        方法Proc1、Func1,可把上述说明修改成以下形式:<br> 

        STestObject=classprocedure<br> 

        Proc1(x:integer); virtual; abstract; <br> 

        stdcall;function Func1(x:integer);<br> 

        virtual; abstract; stdcall;end;TTestObject=class(STestObject)procedure<br> 

        Proc1(x:integer);fuction Func1(x:integer):PChar;<br> 

        procedure Proc2;fuction<br> 

        Func2:integer;end;在C++程序中做如下对象原型说明:class STestObject<br> 

        {virtual void Proc1(int x)=0;virtual char *Func1(int x)=0;};<br> 

        为了能在C++中成功地访问Delphi定义的类, Delphi接口说明时必须<br> 

        包含一个可共享的&quot;制造函数(Factory Function)&quot;CreateTestObject,<br> 

        该制造函数可被定义在动态链接库或目标文件(.OBJ)中,例如:Library<br> 

        TestLib;exports CreateTestObject;function CreateTestObject:STestObject;<br> 

        stdcall;beginResult:=TTestObject.Create;end;…<br> 

        end.经过这样的处理,现在可在C++程序中使用这个由Delphi定义<br>

        的对象,调用方式如下:extern &quot;C&quot; STestObject stdcall<br> 

        *CreateTestObject();void<br> 

        UseTestObject(void) {STestObject *theTestObject=CreateTestObject();theTestObject-&gt;Proc1(10);Char<br> 

        *str=theTestObject-&gt;Func1(0);}当调用制造函数CreateTestObject<br> 

        时,实际上已经在Delphi一侧占用了一个对象实例的空间,C++程序在<br> 

        针对该对象的所有处理完成后必须考虑释放这一空间,具体的实现可<br> 

        在Delphi中定义一个类,如上述Proc1的共享方法Free,以此来完成这<br> 

        一任务:STestObject=classprocedure Proc1(x:integer); virtual;<br> 

        abstract; stdcall;function Func1(x:integer); virtual; abstract;<br> 

        stdcall;procedure Free; virtual; abstract; stdcall;end;…<br> 

        implementation…<br>

        procedure TTestObject.Free;begin…<br> 

        end;…<br>

        end.2.Delphi共享C++对象通常,程序员会考虑使用Delphi来编制<br>

        用户界面,所以Delphi代码调用C++代码似乎显得更加实际些。其实,Delphi<br>

        共享C++对象的实现方法与上述C++共享Delphi对象非常相似。用同样<br>

        的共享接口与实现接口说明方法来定义C++的类:class STestObjedt<br> 

        {virtual void Proc1(int x)=0;virtual char *Func1(int x)=0;};class<br> 

        TTestObjedt :public STestObject {void Proc1(int x);char *Func1(int<br> 

        x);void Proc2();int Func2();void Free();};然后实现这些方法<br> 

        。同样地,C++对象需要一个与之对应的制造函数,这里以DLL为例STestObject<br> 

        stdcall export *CreateTestObject() {return (STestObject *)<br> 

        new TTestObject.Create;}Delphi代码可以通过调用制造函数CreateTestObject,<br> 

        很容易地在C++中创建实例,获得指向该实例的指针值,并以这个指针<br> 

        值来调用对象中的共享方法。当然,在进行完该对象的相关处理后,千<br> 

        万不要忘了调用Free释放占用的空间。<br> 

        </font></p>

     </td>

  </tr>

</table>

<br>

</body>

</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -