<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/delphi-and-cplusplus-object-function-share-html/</link>
<title><![CDATA[在C++与Delphi之间实现函数与对象共享]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Wed, 27 Oct 2010 02:46:53 +0000</pubDate> 
<guid>https://www.heckjj.com/delphi-and-cplusplus-object-function-share-html/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 微软雅黑;">delphi以其独特的面向控件的开发方式、强大的数据库功能以及快速的编译技术,使得它自发布起即格外引人注意。随着delphi 3提供丰富的internet应用,delphi日益成为最重要的软件开发工具之一,它吸引了许多原visual basic、foxpro、dbase甚至c++的程序员,而这些程序员使用delphi时需要解决的一个重要问题就是怎样利用他们原有的代码。本文将介绍delphi与c++程序集成的方法,包括s delphi与c++之间函数的共享;s 代码的静态链接和动态链接;s 对象的共享。<br/><br/>函数的共享<br/>在delphi中调用c++函数与c++调用delphi函数相当直接,需要注意的是,delphi 1默认的函数调用方式是pascal方式,delphi 2、delphi 3的默认方式则是优化的cdecl调用方式,即register方式。要在c++与delphi程序之间实现函数共享,除非有充分的原因,否则应该使用标准系统调用方式,即stdcall方式。为了使c++编译器不将函数标记为&quot;mang led&quot;,使delphi编译器误认为函数是采用cdecl调用方式,应该在c++代码中,以extern &quot;c &quot;说明被共享的函数,如下例所示:<br/><br/>原型说明:<br/>在c++中:&nbsp;&nbsp;extern &quot;c&quot; int _stdcall testfunc();<br/><br/>在delphi中: function testfunc:integer; stdcall;</span><span style="font-family: 微软雅黑;"><br/><br/>调用语法:<br/><br/>在c++中: int i=testfunc();<br/><br/>在delphi中: <br/>var i:integer;<br/>…<br/>begin<br/>…<br/>i:=testfunc;<br/>…<br/>end;<br/><br/>共享函数的参数必须是两种语言都支持的变量类型,这是正确传递参数的前提。诸如delphi的currency、string、set等变量类型,在c++中没有相对应的变量类型,不能被用作共享函数的参数。可以用pchar类型以值参的方式传递字符串指针,这时用户必须注意字符串空间的回收。delphi语言中的变参应被说明成c++中相应变量类型的引用形式,如下:<br/><br/>在delphi中:function testfunc(var i:integer):integer;<br/><br/>在c++中:int testfunc(int &amp;i);<br/><br/>代码链接<br/><br/>在delphi与c++之间实现代码链接可采用静态链接或动态链接的方式。<br/><br/>1.静态链接方式<br/><br/>如果c++程序本身的代码量很小,而且无需担心与c运行库会有交互过程,一般可选用静态链接方式,即把delphi与c++的目标文件(*.obj)链接成最终的可执行文件。具体的方法是使用&#123;$l&#125;编译指令,使delphi编译器自动读取指定目标文件,说明如下:<br/><br/>function testfunc:integer;stdcall;<br/>&#123;$l testfunc.obj&#125;<br/><br/>2.动态链接方式<br/><br/>如果c++代码已经相当全面或自成一个完整的子系统,代码量很大,或者用到了c运行库,在这种情况下,应该使用动态链接库(dll)的方式。此时,在两种语言的源代码中应做如下说明:<br/><br/>在c++中:<br/>int stdcall export testfunc();<br/><br/>在delphi中:<br/>function testfunc:integer; stdcall;<br/>external ‘testfunc.dll’;<br/><br/>对象的共享<br/><br/>在c++与delphi之间的对象共享主要体现在对象方法(method)的共享方面,这种共享可分为两个层次:对象(object)级共享与类(class)级共享。<br/>a、要实现对象级共享,程序设计语言需具备两个前提条件:<br/>b、可以访问由指针确定的对象中的方法。<br/>了要实现类级的共享,则还需考虑:<br/>能够创建由另一种语言定义的类的实例;<br/>a、可以从堆中释放一个实例所占用的空间;<br/>b、派生新的类。<br/><br/>以下介绍在delphi与borland c++之间实现对象共享的方法。<br/><br/>1.c++共享delphi对象<br/><br/>要实现从c++调用delphi对象,首先要在delphi单元的接口部分以及c++的头文件中说明需要共享的对象的接口,在对象接口中定义该对象包含哪些属性与方法,并说明可供共享的部分。对象的共享,关键在于方法的共享。在delphi语言中,要使一个对象可以被共享,可以把它说明为两个接口部分,暂称为&quot;共享接口&quot;与&quot;实现接口&quot;。其中共享接口指明对象中哪些方法可被另一种语言所共享;实现接口则继承共享接口,并且在单元实现部分针对实现接口中的方法定义具体的实现。<br/><br/>要定义一个可供c++共享的delphi对象,共享接口的说明应注意s 在delphi程序里,要共享的方法必须被说明为抽象(abstract),而且虚拟(virtual );s 在c++程序里,必须用关键字&quot;virtual&quot;及&quot;=0&quot;后缀,把从delphi共享的方法说明成&quot;pure virtual&quot;;s 共享的对象方法必须在两种语言里都被说明成相同的调用方式,通常使用标准系统调用方式(stdcall)。下面,举例说明这些规则,假设有这样的一个delphi对象:<br/><br/>ttestobject=class<br/><br/>procedure proc1(x:integer);<br/>function func1(x:integer):pchar;<br/>procedure proc2;<br/>function func2:integer;<br/>end;<br/><br/>如果c++程序需要共享其中的方法proc1、func1,可把上述说明修改成以下形式:<br/><br/>stestobject=class<br/>procedure proc1(x:integer); virtual; abstract; stdcall;<br/>function func1(x:integer); virtual; abstract; stdcall;<br/>end;<br/><br/>ttestobject=class(stestobject)<br/>procedure proc1(x:integer);<br/>fuction func1(x:integer):pchar;<br/>procedure proc2;<br/>fuction func2:integer;<br/>end;<br/><br/>在c++程序中做如下对象原型说明:<br/><br/>class stestobject &#123;<br/>virtual void proc1(int x)=0;<br/>virtual char *func1(int x)=0;<br/>&#125;;<br/><br/>为了能在c++中成功地访问delphi定义的类, delphi接口说明时必须包含一个可共享的&quot;制造函数(factory function)&quot;createtestobject,该制造函数可被定义在动态链接库或目标文件(.obj)中,例如:<br/><br/>library testlib;<br/><br/>exports createtestobject;<br/>function createtestobject:stestobject; stdcall;<br/>begin<br/>result:=ttestobject.create;<br/>end;<br/>…<br/>end.<br/><br/>经过这样的处理,现在可在c++程序中使用这个由delphi定义的对象,调用方式如下:<br/>extern &quot;c&quot; stestobject stdcall *createtestobject();<br/><br/>void usetestobject(void) &#123;<br/>stestobject *thetestobject=createtestobject();<br/>thetestobject-&gt;proc1(10);<br/>char *str=thetestobject-&gt;func1(0);<br/>&#125;<br/><br/>当调用制造函数createtestobject时,实际上已经在delphi一侧占用了一个对象实例的空间,c++程序在针对该对象的所有处理完成后必须考虑释放这一空间,具体的实现可在delphi中定义一个类,如上述proc1的共享方法free,以此来完成这一任务:<br/>stestobject=class<br/>procedure proc1(x:integer); virtual; abstract; stdcall;<br/>function func1(x:integer); virtual; abstract; stdcall;<br/>procedure free; virtual; abstract; stdcall;<br/>end;<br/>…<br/>implementation<br/>…<br/>procedure ttestobject.free;<br/>begin<br/>…<br/>end;<br/>…<br/>end.<br/><br/>2.delphi共享c++对象<br/><br/>通常,程序员会考虑使用delphi来编制用户界面,所以delphi代码调用c++代码似乎显得更加实际些。其实,delphi共享c++对象的实现方法与上述c++共享delphi对象非常相似。用同样的共享接口与实现接口说明方法来定义c++的类:<br/><br/>class stestobjedt &#123;<br/>virtual void proc1(int x)=0;<br/>virtual char *func1(int x)=0;<br/>&#125;;<br/><br/>class ttestobjedt :public stestobject &#123;<br/>void proc1(int x);<br/>char *func1(int x);<br/>void proc2();<br/>int func2();<br/>void free();<br/>&#125;;<br/><br/>然后实现这些方法。同样地,c++对象需要一个与之对应的制造函数,这里以dll为例<br/><br/>stestobject stdcall export *createtestobject() &#123;<br/>return (stestobject *) new ttestobject.create;&#125;<br/><br/>delphi代码可以通过调用制造函数createtestobject,很容易地在c++中创建实例,获得指向该实例的指针值,并以这个指针值来调用对象中的共享方法。当然,在进行完该对象的相关处理后,千万不要忘了调用free释放占用的空间。</span><br/>Tags - <a href="https://www.heckjj.com/tags/delphi/" rel="tag">delphi</a> , <a href="https://www.heckjj.com/tags/c%252B%252B/" rel="tag">c++</a> , <a href="https://www.heckjj.com/tags/%25E5%2587%25BD%25E6%2595%25B0%25E5%2585%25B1%25E4%25BA%25AB/" rel="tag">函数共享</a> , <a href="https://www.heckjj.com/tags/%25E5%25AF%25B9%25E8%25B1%25A1%25E5%2585%25B1%25E4%25BA%25AB/" rel="tag">对象共享</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/delphi-and-cplusplus-object-function-share-html/#blogcomment</link>
<title><![CDATA[[评论] 在C++与Delphi之间实现函数与对象共享]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/delphi-and-cplusplus-object-function-share-html/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>