动态连接库调用问题:
VC++动态连接库申明如下:
#ifndef __MCU30_DLL_H__
#define __MCU30_DLL_H__#ifndef DLL_API
#define DLL_API extern "C" _declspec(dllimport) //_declspec
#endifDLL_API int RS485Recv(unsigned char *Response, //接收缓冲区
unsigned int Responselen,
unsigned int *piLen );
#endifDELPHI调用:
声明如下: function RS485Recv(Response:pchar;Responselen:integer;var
piLen:Integer):integer;cdecl;external 'RS485DLL.dll';
调用:Var Response: pchar;
ii,piLen:integer;
begin
ii:=RS485Recv(@Response,4096,piLen);
showmessage('长度:'+inttostr(pilen)+'数据:'+String(@Response));
end;
问题:最后能显示出取得的数据,但是报地址冲突,请教各位,谢谢!!!
VC++动态连接库申明如下:
#ifndef __MCU30_DLL_H__
#define __MCU30_DLL_H__#ifndef DLL_API
#define DLL_API extern "C" _declspec(dllimport) //_declspec
#endifDLL_API int RS485Recv(unsigned char *Response, //接收缓冲区
unsigned int Responselen,
unsigned int *piLen );
#endifDELPHI调用:
声明如下: function RS485Recv(Response:pchar;Responselen:integer;var
piLen:Integer):integer;cdecl;external 'RS485DLL.dll';
调用:Var Response: pchar;
ii,piLen:integer;
begin
ii:=RS485Recv(@Response,4096,piLen);
showmessage('长度:'+inttostr(pilen)+'数据:'+String(@Response));
end;
问题:最后能显示出取得的数据,但是报地址冲突,请教各位,谢谢!!!
解决方案 »
- 客户端两个ClientDataSet连接应用程序服务器同一个DataSetProvider的问题
- 有关delphi编写网页循环自动提交?
- 刚装的D7就file not found: system.pas
- 如何使(基类窗体)上的控件显示(派生类窗体)上 注:在编辑界面时
- 动态创建的表单,怎么一点击这个表单的按钮,它就自动关闭了呢?
- ms的Agent动画人物,怎么加入鼠标右击事件?
- 高级程序员+delphi程序员找兼职
- delphi中调用dll写数据库,出问题了!
- 为什么我的报表 Sals005PrtFrm.QuickRep1.Preview 预览时会出错?内附源程序
- Key = VK_Return表示的是按键为回车键。不知道所有键都是怎么定义的?VK_??望高手指教。
- 动态创建TWindowsMediaPlayer时遇到的问题
- 小问题,在线等待,急!急!!急!!!谢谢!!!
Response本身就是指针类型的吧
----------------------------------------
原型说明:在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=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)"createtestobject,该制造函数可被定义在动态链接库或目标文件(.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释放占用的空间