都调用一个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;
大家帮忙看下,是哪里出了问题。很急的,谢谢了
以下是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;
大家帮忙看下,是哪里出了问题。很急的,谢谢了
解决方案 »
- ★★★★★--如何取得IE的COOKIE,InternetGetCookie在xp_sp2上不能用
- 请问MDI相关问题
- 一个关于 ppchar 的语法问题!求达人解惑!!!
- 我也做一次引荐人,我熟悉的高手们,贱人们。进来一下,测评部需要人。
- GetLocaleFormatSettings过程中的LCID怎么用?
- ADOcommand數據類型的轉換
- 听说传奇是用delphi做的,真的吗?
- 关于adoquery
- 有关TTreeView的问题
- 谁有Pascal语言的文件压缩和解压缩源程序,LZW,HUF等都可以,请帮忙E-Mail给我一个([email protected])
- delphi界面大小控制
- access更新时间字段类型数据报错
你的VC和DELPHI的结构体定义不一样
要注意类型和结构成员对齐要一致
我写的delphi的结构体定义可能是有点问题。请指教一下
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;