请问如何用delphi和vc混合编程 我现在正在做一个ftp客户端程序,需要用winsock从底层写,我打算用delphi做界面用vc做内核部分,请问如何将delphi做的界面集成到vc中,这个具体步骤是怎样的?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有必要这么麻烦吧?全部用DELPHI写不就完了吗?何必这样做呢?用DELPHI 开发WINSOCK的程序也是非常方便的了,用WINSOCK的API,DELPHI的效率也非常好还有,如果非要用VC+DELPHI的话那你可以把VC的代码写成DLL,然后在DELPHI中调用你写的DLL就可以了 其实DELPHI在开发SOCKET类的程序中效率还算可以的如果真的要VC+DELPHI共享功能的话,,做成DLL动态链接库就可以了 在Delphi与C++之间实现函数与对象共享 浙江省奉化市房地产管理处 邵辉 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、Delphi 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++中没有相对应的变量类型,不能被用作共享函数的参数。可以用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)级共享。要实现对象级共享,程序设计语言需具备两个前提条件: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=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释放占用的空间。 浙江省奉化市房地产管理处 邵辉 请问什么地方有关于winsock的delphi资料? 这个程序的要求是不能使用封装好的控件 三、标准Socket与Delphi中的Socket。标准的Socket的应用程序框架如下:Server方: Socket()[ 新建一个Socket]--Bind()[ 同服务器地址邦定 ]--Listen() --Accept()--block wait--read()[接受消息,在windows平台中,方法为send(TCP)或者是sendto(UDP)]--处理服务请求--Write()[发送消息,在windows平台中,方法为send(TCP)或者为sendto(UDP)。Client方相对简单:Socket()--Connect()[通过一定的port连接特定的服务器,这是与服务器建立连接]--Write()--Read()。Socket可以是基于TCP的,也可以是基于UDP同时Socket甚至建立在其他的协议,比如IPX/SPX,DECNet等。在新建一个Socket时,可以指定新建何类Socket。Bind()用来同服务器的地址邦定,如果一个主机只有一个IP地址,实际上邦定的作用就相对多余了。Listen()开始监听网络,Accept()用于接受连接,其返回值是保持同客户机联系的Socket。在Delphi中,对于Windows中的Socket进行了有效的封装。在Delphi中,按其继承关系,可以分层两类:一、TComponent--TAbstractSocket--TCustomSocket--TCustomServerSocket--TServerSocketTComponent--TAbstractSocket--TCustomSocket--TClientSocket二、直接从TObject继承过来:TObject--TCustomWinSocket--TServerWinSocketTObject--TCustomWinSocket--TClientWinSocketTObject--TCustomWinSocket--TServerClientWinSocket可以看出第一类建立在TCustomSocket基础上,第二类建立在TCustomWinSocket的基础上。第一类建立在TComponet的基础上,第二类直接构建在TObject基础上。因此如果用户非常熟悉Socket并且想要编写控制台程序时,可以使用TCustomWinScoket类。同uses中可以看出,它们都在ScktComp.pas中实现,而在schtComp.pas中,则包含了winsock.pas文件,如果继续深入winsock文件,在其中可以发现所有的Windows Socket的基本方法。实际上,如果你了解了标准Socket的应用程序框架,对于使用Delphi编写Socket应用程序也就得心应手了;这不是说你必须了解复杂的Socket中的标准函数,也没有必要,因为Delphi已经为你做了很好的封装了,这也正是Delphi的强势所在,你只要了解那么一点点的基本框架。这是我对Delphi中的Socket应用的理解,不足之处希望大家指正。同时也乐于为大家解答Delphi中有关Socket的问题。 如何触发EBGridEh OnMoveRecords 事件? 我用delphi做的程序为什么到其它机器上出现错误? 求:附加数据库的源代码 有三个MDL语句,用delphi怎么实现要么三个DML都执行,要么都不执行。有类似事务操作吗?我使用的是ADO. 一個用printers畫布打印問題? 查找字符串中某字的函数? 送分了,大虾帮忙 关于对文件操作!(在线待待) 怎样获取ADOTABLE打开数据表的耗时? 还是C#有前途 高分求解决方案!有好的再加100分!进者有分! 在report builder 中怎样打印 特定的记录
用DELPHI 开发WINSOCK的程序也是非常方便的了,用WINSOCK的API,DELPHI的效率也非常好还有,如果非要用VC+DELPHI的话
那你可以把VC的代码写成DLL,然后在DELPHI中调用你写的DLL就可以了
浙江省奉化市房地产管理处 邵辉 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、Delphi 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++中没有相对应的变量类型,不能被用作共享函数的参数。可以用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)级共享。
要实现对象级共享,程序设计语言需具备两个前提条件:
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释放占用的空间。
浙江省奉化市房地产管理处 邵辉
这个程序的要求是不能使用封装好的控件
实际上,如果你了解了标准Socket的应用程序框架,对于使用Delphi编写Socket应用程序也就得心应手了;这不是说你必须了解复杂的Socket中的标准函数,也没有必要,因为Delphi已经为你做了很好的封装了,这也正是Delphi的强势所在,你只要了解那么一点点的基本框架。这是我对Delphi中的Socket应用的理解,不足之处希望大家指正。同时也乐于为大家解答Delphi中有关Socket的问题。