都调用一个DLL,通过回调函数所对应的指针来取值。
以下是VC的代码//这是定义的结构体,回调函数返回时的指针指向LPMOVEDETECT
typedef struct
{
unsigned int object_type;
unsigned int er_type;
}MOVEDETECTPARAM,*LPMOVEDETECTPARAM;typedef struct
{
unsigned  char  nChannelID ;
unsigned  int mvObjNum;  
MOVEDETECTPARAM mv_Marker[3];
}MOVEDETECT,*LPMOVEDETECT;
//这是在回调函数里写的
LPMOVEDETECT lpmdetect =(LPMOVEDETECT)pContext ;
pDlg->m_pMovedetectDlg->GetMoveDetectRule((char*)lpmdetect);//调用一个函数
//函数如下:
void CMoveDetectDlg::GetMoveDetectRule(char * pd)
{
LPMOVEDETECT lp =(LPMOVEDETECT)pd  ; 
if(lp ==NULL) return  ;
m_objnum =lp->mvObjNum ; if( lp->nChannelID == g_nChannelId)

for(int i =0 ;i<3;i++)
{
SetObjRule(lp->mv_Marker[i].object_type,lp->mv_Marker[i].er_type);
}
}
        ......
}
delphi代码如下://定义的结构体
type
  MOVEDETECTPARAM = record
    object_type : byte;
    er_type : byte;
  end;
type LPMOVEDETECTPARAM = ^MOVEDETECTPARAM;type
  MOVEDETECT = record
    nChannelID : Byte;
    mvObjNum : byte; 
    mv_Marker : array [0..2] of LPMOVEDETECTPARAM;
  end;
type LPMOVEDETECT = ^MOVEDETECT;
//回调函数中
{
  ...
  MOVEDETECT := LPMOVEDETECT(pContext);
  CSetMoveRule(Pointer(MOVEDETECT));
  ...
}
//CSetMoveRule函数
procedure TfrmMainUnit.CSetMoveRule(P : Pointer);//(P:LPMOVEDETECT);
//我原来用LPMOVEDETECT这个类型做为参数传入,但有问题,所以改为用Pointer
var
  I,OType,MType : Integer;
  LLP : LPMOVEDETECT;
begin
  try
      LLP := LPMOVEDETECT(P);
      DXNumber.Text := IntToStr(LLP.mvObjNum);
      for I := 0 to 2 do
      begin
          OType := LLP.mv_Marker[I].object_type;
          //我这行包括下一行取不到值,我跟踪过LLP.mv_Marker[I]所指向的是一个内存地址,但就是取不出后面的object_type和er_type的值
          MType := LLP.mv_Marker[I].er_type;
          SetObjRule(OType,MType);
      end;
  ...
end;
大家帮忙看下,是哪里出了问题。很急的,谢谢了

解决方案 »

  1.   

    首先确认一下是否引用ShareMem
      

  2.   

    pContext 是回调函数里获取的么
    你的VC和DELPHI的结构体定义不一样
    要注意类型和结构成员对齐要一致
      

  3.   

    是的,pContext是回调函数返回的一个指针。
    我写的delphi的结构体定义可能是有点问题。请指教一下
      

  4.   


    type
      MOVEDETECTPARAM = record
        object_type : LongWord;
        er_type : LongWord;
      end;
    type LPMOVEDETECTPARAM = ^MOVEDETECTPARAM;type
      MOVEDETECT = record
        nChannelID : Byte;
        mvObjNum : integer; 
        mv_Marker : array [0..2] of LPMOVEDETECTPARAM;
      end;
    type LPMOVEDETECT = ^MOVEDETECT;