怎样将c中的指针类型转换成delphi中的记录类型???急(30分)

  • 主题发起人 主题发起人 wenaideyu
  • 开始时间 开始时间
W

wenaideyu

Unregistered / Unconfirmed
GUEST, unregistred user!
c中定义如下:
MessCallBack(int command,char *ipaddr,char *buf,int ilen);
其中在下面的处理中有这样一个转换
pAlarmInfo = (ALARMINFO *)buf;
ALARMINFO 定义如下
typedef struct{
DWORD dwAlarmType;
DWORD dwAlarmInputNumber;
DWORD dwAlarmOutputNumber[ALARMOUT_NUM];
DWORD dwAlarmRelateChannel[CHANNEL_NUM];
DWORD dwChannel[CHANNEL_NUM];
DWORD dwDiskNumber[DISK_MAXNUM];
}ALARMINFO,*LPALARMINFO;
在delphi中调用 MessCallBack int command,char *ipaddr,char *buf,int ilen);
转换成procedure v_MessCallBack(command : integer;ipaddr,buf,ilen: pchar);
请问怎样把buf中的值转成相应类型?????
 
buf 是什么类型,如果是string
pchar(buf)
 
ok 我来帮您!
在Delphi中Pchar是指针,逻辑上指向字符串数组的地址,但是这并没有关系,
仍然可以用来表示结构体的指针。。可以这样定义。。
type
pAlarmInfo=^ALARMINFO ;

LPALARMINFO=^ALARMINFO ;

ALARMINFO = Record

dwAlarmType:DWORD;
dwAlarmInputNumber:DWORD;
dwAlarmOutputNumber : array [1..ALARMOUT_NUM] of DWORD;
dwAlarmRelateChannel : array [1..CHANNEL_NUM] of DWORD;
dwChannel : array [1..CHANNEL_NUM] of DWORD ;
dwDiskNumber : array [1..DISK_MAXNUM] of DWORD;
end;

var
MYINFO:ALARMINFO ;

其中ALARMOUT_NUM CHANNEL_NUM DISK_MAXNUM 应该是常量,你没有给出我不好定义。。
当调用MessCallBack();时候 buf 参数这样给: Pchar(@MYINFO) ,就可以了
 
其实在 c 和 delphi 中 , buf 都是 指针, 都是指向结构体 。。。
 
to :刘麻子
您好:
问题是这样的:
MessCallBack(int command,char *ipaddr,char *buf,int ilen);是一个dll(用c写的)
中的回调函数,我现在要在delphi中用到这个dll中的MessCallBack,因此,我在delphi中定义了一个
procedure v_MessCallBack(command : integer;ipaddr,buf,ilen: pchar);stdcall;
因此,传进去就是buf,然后dll中回调,通过buf将ALARMINFO类型的信息传出来,在v_MessCallBack的实现部分进行处理,在这在c中只要:
ALARMINFO *pAlarmInfo;pAlarmInfo = (ALARMINFO *)buf;就可以了;
但在delphi中,buf是pchar类型,怎样通过传回来的buf;去获得ALARMINFO类型的信息???谢谢
 
好象这样就可以了
procedure v_MessCallBack(command : integer;ipaddr,buf,ilen: pchar);stdcall;//回调函数
var
loginfo: pTFLOGENTRY;
begin
loginfo := pTFLOGENTRY(buf);
 
首先更正一个问题 , 就是 ALARMINFO = Record 可能要 应该改为 packed Record 。。。
 
我说的不一定对啊,仅供参考.....:
procedure v_MessCallBack(command : integer;ipaddr,buf: pchar,ilen:integer);stdcall
var
loginfo: pTFLOGENTRY;
begin
loginfo := pTFLOGENTRY(buf)
 
其实我对Pascal也不是很熟悉。。。我以前也是学C语言的。。。

关于packed Record,我又想了一下,应该是用不用都无所谓,因为在这里域都是32
位的,所以不存在地址对正问题....... 恩,就是这样,就象我开始那样定义就可以!
 
接受答案了.
 
后退
顶部