给定一个变量,将该变量值作为指针地址赋给一结构体指针
TEvt=Record
AcsHandle:Thandle;
mID: TID;
Size:Integer;
EventType:integer;
Param :word;
end;
pEvt=^TEvt;var
ppEvt:pEvt;
begin ppEvt:=pEvt(addr); //addr 为longint 是外部传进来到的地址,该地址存放的是同样结构体的数据。
showmessage(inttostr(ppEvt.Size));
//显示读地址错误,如何将该地址的结构体数据传到ppEvt?
end;
TEvt=Record
AcsHandle:Thandle;
mID: TID;
Size:Integer;
EventType:integer;
Param :word;
end;
pEvt=^TEvt;var
ppEvt:pEvt;
begin ppEvt:=pEvt(addr); //addr 为longint 是外部传进来到的地址,该地址存放的是同样结构体的数据。
showmessage(inttostr(ppEvt.Size));
//显示读地址错误,如何将该地址的结构体数据传到ppEvt?
end;
typedef struct
{
ACSHandle_t m_s32AcsHandle; /acs handle/
DeviceID_t m_DeviceID; /Device ID/
DJ_S32 m_s32EvtSize; /Evt size/
EventType_t m_s32EventType; /event type code/
DJ_U32 m_u32EsrParam; /App esr param/
}Acs_Evt_t;/**/
DJ_Void EvtHandler(unsigned long esrParam)
{
Acs_Evt_t * pAcsEvt = NULL;pAcsEvt = (Acs_Evt_t *) esrParam;
// 表示把esrParam的值,看成一个Acs_Evt_t结构变量的地址值,让Acs_Evt_t *类型的指针pAcsEvt指向这个结构.
DispEventInfo ( pAcsEvt );
}EvtHandler 是回调函数,esrParam 是传进来的指针地址。以下如何转成DELPHI:
pAcsEvt = (Acs_Evt_t *) esrParam;
XMS_acsSetESR(ACSHandle_t acsHandle,EsrFunc esr,DJ_U32 esrParam,BOOL notifyAll); // DLL
r = XMS_acsSetESR ( g_acsHandle, (EsrFunc)EvtHandler, 0, 1 ); //设置回调函数
Delphi:
CallbackProc=Procedure(esrParam:word); stdcall;
Function XMS_acsSetESR(ACSHandle_t:Thandle;EsrFunc:CallbackProc; esrParam:Word; notifyAll:Boolean):Integer; stdcall; far external 'DJAcsAPI.dll';procedure ProcCallBack(esrParam:word); stdcall;
var
pAcsEvt:pAcs_Evt_t;
pAcsDevList: pAcs_Dev_List_Head_t ;
begin
pAcsEvt:=pAcs_Evt_t(esrParam);
{
取pAcsEvt结构体的数据处理
}
end;
if i<0 then
showmessage('设置事件失败,错误代码:'+inttostr(i))
else
begin end;
pAcsEvt:pAcs_Evt_t;
pAcsEvt:=pAcs_Evt_t(esrParam);// esrParam 是个word,怎可能转为地址?
// 表示把esrParam的值,看成一个Acs_Evt_t结构变量的地址值,让Acs_Evt_t *类型的指针pAcsEvt指向这个结构.
VC里直接强制装换没问题。esrParam传的就是地址 。
你要买把word该dword。
var
p,q :PInt;
param :longint;
begin
New(p);
param :=Integer(p);//取得地址,实际上就是一个4字节的整数。
q := PInt(param); //将这个整数作为地址赋给q
p^ := 100;
showmessage(intToStr(q^));
Dispose(p);
end;
上面代码没问题,如果是结构体指针就有问题。