delphi调用C++中写的DLL文件中的数组指针型结构体问题(200分)

  • 主题发起人 主题发起人 sunaky
  • 开始时间 开始时间
S

sunaky

Unregistered / Unconfirmed
GUEST, unregistred user!
在VC开发的DLL中有个函数,定义如下:
long WINAPI Sms_SendDx(SmsSend * pSms , long lCount , BOOL bWaitRet );//lCount记录的条数
SmsSend 结构体的定义:SmsSend typedef struct _SmsSend
{
long lSmsID;//返回ID,最多可以支持100条返回
long reserve;
char szMobile[24];
//手机号码
char szMsg[168];
//内容
}SmsSend;
我在DELPHI定义的结构如下:
type
Psms_ma=^Tsms_ma;

Tsms_ma = packed record
lSmsID:longint;
reserve:longint;
szMobile:array [0..23] of char;
//手机号码
szMsg:array [0..167] of char;
//内容
end;

tsms_mas =array of tsms_ma;
不管我有Psms_ma,Tsms_ma,tsms_mas,point类型去定义那一个结构体变量,都不能成功,请各位大侠帮忙看看,指点一下!先在这里多谢各位的热情!并送分!以表心意!
 
这样行不行
function Sms_SendDx(var pSms: Tsms_ma;
lCount: integer;
bWaitRet: Boolean): integer;
 
type
Psms_ma = ^Tsms_ma;

Tsms_ma = packed record
lSmsID: longint;
reserve: longint;
szMobile: array [0..23] of char;
//手机号码
szMsg: array [0..167] of char;
//内容
end;
function Sms_SendDx(Psms_ma pSms;
Integer lCount;
boolean bWaitRet): Integer: stdcall;
调用
var
sms: Tsms_ma;
lCount: integer;
bWaitRet: Boolean
begin

Sms_SendDx(@sms, lCount, bWaitRet);
...
end;
 
就用 Psms_ma 应该可以的啊
 
在做接口时参数只定义成Long或LongInt/Cardinal型
只要变量字节宽度相同就可以
在实际传递时发起方把实际的数据指针转成Long型发给DLL
DLL在通过强制类型转换,把它变成原来的类型指针
就可以访问了
如果使用了多线程的话
一定要保证同一时刻只有一个线程访问数据
 
谢谢各位:
to:luzhouman,uiit,来如风,:这样不行,因为要传多条记录进去,那个一定要是个数组,不然只能传一条记录,这个是个群发短信,同时传多条,并返回发送成功ID回来
to:Mike1234567890:我是写在线程里,能否详细点!谢谢!
 
这样行不行
function Sms_SendDx(pSms: Pointer;
lCount: integer;
bWaitRet: Boolean): integer;

var
aa: array[1..10] of Tsms_ma;
begin
Sms_SendDx(@aa, 10, True);
end;
 
唉,为什么不自己想想试试呢,就轻易给我的东西下结论呢
这样子很难令我有兴趣跟帖,就跟一次了
我写的那个应该可以,只要把调用函数改一下即可
既然你说是数组,那传入的lCount就应该是数组长度了
只要你事先分配内存,然后传进来
分配lCount个Tsms_ma
arrTsms_ma: array[1..lCount] of Tsms_ma;
Sms_SendDx(@arrTsms, lCount, bWaitRet);
或者你声明为指针
pSms: Psms_ma
GetMem(pSms, sizeof(Tsms_ma) * lCount)
...
FreeMem()
..
原理就是这样了,在转换函数原型这里也就是内存的分配要考虑清楚而已
至于你用线程,也就是考虑线程数据的同步而已,我也懒得说什么了
 
to:uiit 搞的我非常晕,不好意思!我有试,不过对DELHPI中的指针认识不够,调用DLL不多少!我是一个很直的人,不过得到你们的帮忙,相信会很快有结果,哈哈!谢谢!
to:all 谢谢大家!
 
大家说的都不错,问题已解决,谢谢大家!
 
后退
顶部