给定一个变量,将该变量值作为指针地址赋给一结构体指针
 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;

解决方案 »

  1.   

    是事件回调函数传进来的地址,该地址存了DLL通过网络发送的结构体数据。方便QQ交流吗?465595046,非常感谢可以帮忙。
      

  2.   

    /Acs_Evt_t/
    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;
      

  3.   

    longint 方法的实现代码贴出来看看,尽量完整
      

  4.   

    VC:
            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;
      

  5.   

    i:= XMS_acsSetESR(ACSHandle,@ProcCallBack, 0, true );
         if i<0 then
         showmessage('设置事件失败,错误代码:'+inttostr(i))
         else
         begin     end;
      

  6.   

    esrParam:Word; 
    pAcsEvt:pAcs_Evt_t;
    pAcsEvt:=pAcs_Evt_t(esrParam);// esrParam 是个word,怎可能转为地址?
      

  7.   

    pAcsEvt = (Acs_Evt_t *) esrParam;
    // 表示把esrParam的值,看成一个Acs_Evt_t结构变量的地址值,让Acs_Evt_t *类型的指针pAcsEvt指向这个结构.
    VC里直接强制装换没问题。esrParam传的就是地址 。
      

  8.   

    DJ_U32 esrParam // 你看看这个DJ_U32是怎么定义的,啥数据类型?
      

  9.   

    typedef unsigned long     DJ_U32;
      

  10.   

    你把一个word类型转为一个地址,word取值是0~65535,这个范围转为一个地址肯定是非法地址。
    你要买把word该dword。
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    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;
    上面代码没问题,如果是结构体指针就有问题。