一DLL需要供其他开发工具调用:
函数声明:
一
int checkname(userinfo* usrInfo, workinfo* winfo, char* msg);//基于C++`
对应Delphi里这样声明:
type
userinfo = record
userid: integer;
username: array[0..20] of char; //pchar 用字符数组可否接收char*数据,即客户传入char* username这样的数据可否正常接收
userpassword: array[0..20] of char; //pchar 同上
end;
puserinfo = ^userinfo;
workinfo = record
workid: integer;
workaddr: array[0..140] of char;//同上
workexp: array[0..140] of char;//同上
end;
pworkinfo = ^workinfo;
function checkname(puInfo: puserinfo; pwkinfo: pworkinfo; msg: pchar): integer; stdcall;
1.这个函数对应Delphi里的声明是否有问题?
2.如果字符数组不能满足上面的要求,那么应该需要将char*(对应delphi里应该是pchar)转换成string或其他Delphi可以进
行操作的数据类型(比如转成另一个结构,进行网络传输)
3.在编写过程中还需注意些什么?
二
int getList(userinfo* usrInfo, usercj[] usrcj, char* msg) ;
对应Delphi里这样声明:
type
userinfo = record
userid: integer;
username: array[0..20] of char; //pchar 用字符数组可否接收char*数据,即客户传入char* username这样的数据可否正常接收
userpassword: array[0..20] of char; //pchar 同上
end;
puserinfo = ^userinfo;
usercj = record//用户成绩 举例
userid: integer;//传入
cjtype: array[0..20] of char;//同上 传出此值
cjname: array[0..20] of char;//同上 传出此值
cjDetail: double;// 传出
end;
function getList(puInfo: puserinfo; var usrcj: array of usercj; msg: pchar);
1.var usrcj: array of usercj 进来的值应该是引用,usercj[] usrcj c++里对数组,如同指针操作,这样声明对否??不对,应该如何做?
2.delphi dll中,对动态数组做为参数及返回值有一个规定即在工程单元里须加入shareMem单元,不知还有什么其他需要注意的地方?
3.同一里的2小点
由于这方面的经验不是很丰富,请各位大人提宝贵意见!!谢谢!!!
函数声明:
一
int checkname(userinfo* usrInfo, workinfo* winfo, char* msg);//基于C++`
对应Delphi里这样声明:
type
userinfo = record
userid: integer;
username: array[0..20] of char; //pchar 用字符数组可否接收char*数据,即客户传入char* username这样的数据可否正常接收
userpassword: array[0..20] of char; //pchar 同上
end;
puserinfo = ^userinfo;
workinfo = record
workid: integer;
workaddr: array[0..140] of char;//同上
workexp: array[0..140] of char;//同上
end;
pworkinfo = ^workinfo;
function checkname(puInfo: puserinfo; pwkinfo: pworkinfo; msg: pchar): integer; stdcall;
1.这个函数对应Delphi里的声明是否有问题?
2.如果字符数组不能满足上面的要求,那么应该需要将char*(对应delphi里应该是pchar)转换成string或其他Delphi可以进
行操作的数据类型(比如转成另一个结构,进行网络传输)
3.在编写过程中还需注意些什么?
二
int getList(userinfo* usrInfo, usercj[] usrcj, char* msg) ;
对应Delphi里这样声明:
type
userinfo = record
userid: integer;
username: array[0..20] of char; //pchar 用字符数组可否接收char*数据,即客户传入char* username这样的数据可否正常接收
userpassword: array[0..20] of char; //pchar 同上
end;
puserinfo = ^userinfo;
usercj = record//用户成绩 举例
userid: integer;//传入
cjtype: array[0..20] of char;//同上 传出此值
cjname: array[0..20] of char;//同上 传出此值
cjDetail: double;// 传出
end;
function getList(puInfo: puserinfo; var usrcj: array of usercj; msg: pchar);
1.var usrcj: array of usercj 进来的值应该是引用,usercj[] usrcj c++里对数组,如同指针操作,这样声明对否??不对,应该如何做?
2.delphi dll中,对动态数组做为参数及返回值有一个规定即在工程单元里须加入shareMem单元,不知还有什么其他需要注意的地方?
3.同一里的2小点
由于这方面的经验不是很丰富,请各位大人提宝贵意见!!谢谢!!!
1.如果要传递或返回字符串类型,用pchar代替string;建议不要使用动态数组;
2.导出的函数用stdcall调用.
3.传递记录(C++的结构)最好加packed关键字;
4.不要返回任何TObject的派生类
这个当然可以.
=============================================
我试了一下,在Dll中定义一个简单的函数
type
userinfo = record
userid: integer;
username: array[0..20] of char;
userpassword: array[0..20] of char;
end;
puserinfo = ^userinfo;
procedure test(puInfo: puserInfo); stdcall;
begin
puinfo.userid := 111;
puinfo.username := 'testname';
puinfo.userpassword := 'testpwd';
end;exports
test;主调函数:
type
userinfo = record
userid: integer;
username: pchar;
userpassword: pchar;
end;
puserinfo = ^userinfo;
因为按照函数的定义为char* ,对应delphi应该为pchar,所以传入以上结构数据,由于手头
没有其他开发环境,不能对vb,vc,pb等测试
procedure mytest();
var
p: puserinfo;
begin
getmem(p, sizeof(userinfo));
test(p);
ShowMessage(p^.username + ' ' + p^.userpassword);//运行这句时报错
freemem(p);
end;
结论:
简单测试后,发现如果定义为char*的数据,用char[0..n] of char 这种方式接收可能有问题,不知道大家有什么意见!!!!
2.需要传入的参数是结构数组,而这个结构数组还可能不是定长的,动态数组,而delphi
dll对动态数组做为参数的导出函数好象有些问题,上网查资料而来!!如果是结构数组的话,你可以传结构数组指针呀.
至于你说的动态数组,那可以做一个尾标记,可以在VC里用WHILE读,读到结束标志为止.
这个我没用过,只是这么想的,我们传VC的数组都是固定的(便于初始化和最后释放),(一般谁申请的请释放)=============================================================
首先说一下,下面这个函数
int getList(userinfo* usrInfo, usercj[] usrcj, char* msg);
由于c++里的数组操作,等同于指针,即知道首地址后,通过指针对其操作,c++忘记了许多,不知道有没有错!!
上面的函数,对应delphi里应该如何写???
function getList(puInfo: puserinfo; var usrcj: array of usercj; msg: pchar);
对应该此函数有何问题??
今天进行了一下测试
调用端:
function getList(puInfo: puserinfo; usrcj: array of usercj{此处去掉var}; msg: pchar): integer; stdcall; extenal 'test.dll';
如果调用的Dll中的
function getList(puInfo: puserinfo; var usrcj: array of usercj; msg: pchar): integer;
结果还是可以把usrcj的值返回给调用端(传递的地址);
请大家多提一下这方面的意见,谢谢!!
你说了那么多,其实要其它工具能调用delphi编的dll,应该注意:
1.如果要传递或返回字符串类型,用pchar代替string;建议不要使用动态数组;
==================================================================
需要传递或返回字符串,清楚string在dll中有问题,但由于pchar的不定长特性,传进来的结构由于还需进行网络的传输,即通过record这种形式传送到服务器端 ,由于pchar不是定长的,所以不可以,考虑将传进来的参数能过一个转换函数,转到char[0..100] of char 这种类型.
2.导出的函数用stdcall调用.
==================================================================
已添加此标识
3.传递记录(C++的结构)最好加packed关键字;
==================================================================
packed是对位结构,考虑加此关键字
4.不要返回任何TObject的派生类
==================================================================
此应用中不会返回这种类to luxuewei5214(小卢)
不用sharemem的话,可以看看fastMM4,说是比较好点
==================================================================
昨天上网找到这个类,fastsharemem-2.10,考虑将sharemem包去掉谢谢二位的回答!!
用基本类型的数据.