C语句如何对应Delphi语句 本帖最后由 wbjj_plus 于 2012-10-15 19:21:37 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 已经定义了,可是不正确。帮忙看下下面的哪里出问题了?谢谢!************************************Function(dwChannel,color,font_size : longint; Line1 ,Line2 : PWORD) : integer;stdcall;VAR fData1 : PWORD ; fData2 : PWORD ; PSdk4000Func := GetProcAddress(FSdk4000Func,'EEoSetOsdDisplayMode') ; if PSdk4000Func <> nil then begin FunEEoSetOsdDisplayMode := TEEoSetOsdDisplayMode(PSdk4000Func); GetMem(fData2,sizeof(WORD) * 20) ; fData2^ := WindowFirIn.Height + 5 ; INC(fData2) ; fData2^ := WindowFirIn.Left + 5 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := 0 ; iRet := FunEEoSetOsdDisplayMode(iTV1,10,80,fData2,fData2) ; //FreeMem(fData2) ; end;****************************************** 及函数名。如果是dll中的函数显示加载必须定义函数原型type TFun= procedure(....);否则 type funname(....) ....external dllname; PSdk4000Func := GetProcAddress(FSdk4000Func,'EEoSetOsdDisplayMode') ; if PSdk4000Func <> nil then begin FunEEoSetOsdDisplayMode := TEEoSetOsdDisplayMode(PSdk4000Func);************************************************************GetProcAddress(LoadLibrary的返回值, 函数名)他返回的是函数在进程中的地址。看看msdn typeTfun=Function(dwChannel,color,font_size : longint; Line1 ,Line2 : PWORD;bAutoLight:Boolean) : integer;stdcall;VAR fData1 : PWORD ; fData2 : PWORD ; PSdk4000Func:Tfun; 多了一个;bAutoLight:Boolean参数另外,不正确是编译还是运行? 这是C程序:**************************int CEEoServerDlg::Init(){ int nRet = 0; DWORD i;// USHORT osdFormat1[] = {0,0, OSD_Year4, '-', OSD_Month2, '-', OSD_Day, ' ', //OSD_Hour12, ':', OSD_Minute, ':', OSD_Second, ' ', 0};// USHORT osdFormat1[] = {0,0, 0, 0, 0, 0,0, 0, // 0, 0, 0, 0,0, 0, 0}; USHORT osdFormat1[] = {0,0, 0}; USHORT osdFormat2[] = {0, 0, '思','睿', '科', 0, '0', '0',0}; char szChannel[20]; GetWindowRect(&m_rcParent); if(!MTALoadLibrary(5000, WORK_AS_SERVER)) { AfxMessageBox("To initialize net work sdk failed!"); } else { if(!MTARegNotifier(&NetNotifierProc)) AfxMessageBox("To register net work notifier callback function failed!"); } nRet = EEoInit(); if(nRet >= 0) { m_dwVideos = EEoGetTotalChannels(); if(m_dwVideos > 0) { DWORD k = m_dwVideos; int nWidth, nHeight; CRect rcClient; EEoEnableOverlay(FALSE); CreateButtons(); EEoSetVideoStandard(VS_PAL_BDGHI);//VS_NTSC // for(i=0; i<m_dwVideos; i++) /* EEoSetCaptureSize(0, 352, 288); // EEoSetCaptureSize(352, 288); EEoSetCaptureSize(1, 704, 576); EEoSetCaptureSize(2, 704, 576); EEoSetCaptureSize(3, 704, 576);*/ // EEoSetCaptureSize(704, 576); EEoSetVideoFormat(VF_YUY2); m_VideoWnds = new CVideoWnd[m_dwVideos]; GetClientRect(&rcClient); if(k>3) k= (DWORD) sqrt((float)m_dwVideos); if(k*k<m_dwVideos) k= k+1; nWidth = (rcClient.Width() - 200) / k; nHeight= (rcClient.Height()- 50) / k; EEoSetCaptureSize(/*704, 576*/352, 288); for(i=0; i<m_dwVideos; i++) { rcClient.left = 1 + nWidth*(i%k); rcClient.top = 1 + nHeight*(i/k); rcClient.right = rcClient.left + nWidth - 1; rcClient.bottom= rcClient.top + nHeight - 1; m_VideoWnds[i].SetVideoIndex(i); m_VideoWnds[i].Create(rcClient, this); m_VideoWnds[i].GetClientRect(&rcClient); // EEoSetCaptureSize(i, 704, 576);// if(i % 4 == 1)// {// EEoSetCaptureSize(i, 640, 480);// osdFormat2[0] = 640 - 85;// osdFormat2[1] = 480 - 34;// } // else { osdFormat2[0] = 352 - 55; osdFormat2[1] = 240 - 10; } wsprintf(szChannel, "%02d", i+1); //osdFormat2[4] = szChannel[0]; //osdFormat2[5] = szChannel[1]; DWORD ki= EEoGetVideoSignal(i); { EEoSetFrameRate(i, 25); EEoOpenChannel(i); // EEoAssignFrameRate(); EEoSetEncoderParam(i, 1024000, 25); EEoStartVideoPreview(i, m_VideoWnds[i].GetSafeHwnd(),&rcClient); } // else { // EEoCloseChannel(i); } EEoSetupMotionDetection(i, 5, MotionAnalyzerProc, this); //EEoSetOsdDisplayMode(i, RGB(255,255,255), /*(i%4 == 1) ? 32:*/50, osdFormat1, osdFormat2); EEoSetOsdDisplayMode(i, 255, /*(i%4 == 1) ? 32:*/50, osdFormat1, osdFormat2); EEoSetOsd(i, 1); EEoRegisterVideoStreamCallback(i, VideoStreamProc); EEoRegisterVideoRawDataCallback(i, VideoRawStreamProc); // EEoRegisterAudioStreamCallback(i, AudioStreamProc); // EEoStopVideoPreview(i); ((CButton*)GetDlgItem(IDC_CHK_PREVIEW+i))->SetCheck(TRUE); } m_VideoWnds[0].GetWindowRect(&m_rcLarge); m_rcLarge.right = m_rcLarge.left + nWidth*k - 11; m_rcLarge.bottom= m_rcLarge.top + nHeight*k - 11; ScreenToClient(&m_rcLarge); m_dwAudio= EEoGetAudioDevNum(); for(i= 0; i<m_dwAudio; i++) { EEoRegisterAudioStreamCallback(i, AudioStreamProc); } } /*else { GetDlgItem(IDC_BTN_START_RECORD_ALL)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_STOP_RECORD_ALL)->EnableWindow(FALSE); }*/ } else { GetDlgItem(IDC_BTN_START_RECORD_ALL)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_STOP_RECORD_ALL)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_DEFAULT)->EnableWindow(FALSE); m_sldBright.EnableWindow(FALSE); m_sldContrast.EnableWindow(FALSE); m_sldHue.EnableWindow(FALSE); m_sldSaturation.EnableWindow(FALSE); GetDlgItem(IDC_BTN_SNAP)->EnableWindow(FALSE); GetDlgItem(IDC_CHK_MOTION_DETECT)->EnableWindow(FALSE); GetDlgItem(IDC_CHK_OSD)->EnableWindow(FALSE); }// EEoStartCaptureFile(0, "c:\\Videos\\0Video.avi");// CFCreate(); return nRet;}int WINAPI EEoSetOsdDisplayMode(DWORD dwChannel, DWORD color, DWORD font_size, USHORT* Line1, USHORT* Line2);*********************************下面的是Delphi的函数定义: TEEoSetOsdDisplayMode = Function(dwChannel,color,font_size : longint; Line1 ,Line2 : PInteger) : integer;stdcall; 下面是Delphi源程序: var iRet,rTV1,rTV2,iCount,oCount : integer; sSQL : string ; fData1 : PWORD ; fData2 : PWORD ;begin PSdk4000Func := GetProcAddress(FSdk4000Func,'EEoSetOsdDisplayMode') ; if PSdk4000Func <> nil then begin FunEEoSetOsdDisplayMode := TEEoSetOsdDisplayMode(PSdk4000Func); GetMem(fData1,SizeOf(PWORD)*10) ; fData1^ := 0 ; INC(fData1,2) ; fData1^ := 0 ; INC(fData1,2) ; fData1^ := 0 ; //FreeMem(fData1) ; //GetMem(fData2,SizeOf(WORD)*100) ; GetMemory(SizeOf(fData2)*100); fData2^ := 0 ; INC(fData2) ; fData2^ := 0 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := 0 ; iRet := FunEEoSetOsdDisplayMode(iTV1,10,80,@fData1,@fData1) ; FreeMem(fData1,SizeOf(WORD)*100) ; FreeMem(fData2,SizeOf(WORD)*100) ; end;end;*********************************************************这个函数USHORT*在Delphi中如何对应?帮忙看下我上面的定义错在哪里?编译可以通过,运行出虚拟地址错误。 USHORT* Line1, USHORT* Line2,是这两指针的问题吧,他们提供的DEMO里面这两指针是什么东西来的。而你用Delphi时输入的是什么? TEEoSetOsdDisplayMode = Function(dwChannel,color,font_size : longint; Line1 ,Line2 : PInteger) : integer;stdcall;指针定义不对吧--PWORD,这两指针你传入的是什么啊。 fData1^ := 0 ; INC(fData1,2) ; fData1^ := 0 ; INC(fData1,2) ; fData1^ := 0 ; //FreeMem(fData1) ; //GetMem(fData2,SizeOf(WORD)*100) ; GetMemory(SizeOf(fData2)*100); fData2^ := 0 ; INC(fData2) ; fData2^ := 0 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := $BDF8 ; INC(fData2) ; fData2^ := 0 ; iRet := FunEEoSetOsdDisplayMode(iTV1,10,80,@fData1,@fData1) ; FreeMem(fData1,SizeOf(WORD)*100) ; FreeMem(fData2,SizeOf(WORD)*100) ; end;end; iRet := FunEEoSetOsdDisplayMode(iTV1,10,80,fData1,fData1) ;不要取地址了吧。后面那个fdata1是不是应该是fdata2啊。 TEEoSetOsdDisplayMode = Function(dwChannel,color,font_size : longint; Line1 ,Line2 : PInteger) : integer;stdcall;你都漏了最后一个参数,会导致堆栈异常的。WINAPI EEoSetOsdDisplayMode(DWORD dwChannel, DWORD color, DWORD font_size, USHORT* Line1, USHORT* Line2【, BOOL bAutoLight=FALSE】)上次就指出了有缺省值的参数,也是需要定义的 fdata1和fdata2是一样的,测试的时候都是错的。 BOOL bAutoLight=FALSE这是默认参数,你在Delphi中的原型定义不对,应该是:TEEoSetOsdDisplayMode = Function(dwChannel, color, font_size: cardinal; Line1, Line2: PWord; bAutoLight: longbool = false) : integer;stdcall; BOOL bAutoLight这个参数去掉也不对,加上也不对。 iRet := FunEEoSetOsdDisplayMode(iTV1,10,80,fData1,fData1) ;不要取地址了吧,fdata1,fdata2本身已经是地址吧。getmem(fdata1,size)这个size是不是小于他DMEO里面传进去的SIZE哦。 delphi中怎么选择文件夹 晕了,关于字符串拆分的问题~~~ 如何替换memo1里的内容? fastreport 3.02 动态调整页边距 问题 怎样监视一个进程在磁盘上生成文件或修改文件? 花了四五个小时才搞定不需要额外控件的XP风格界面和Listview问题,paint... 如何获得bios的版本信息? 请问有没有支持jpg格式的dbimage控件? 急!急!三层结构,Client端调用App Server端的过程时报错"接线者无效",详细见里面 如何控制任务栏? NSIS打包BDE 离线时保存本地,联网时自动上传的问题
帮忙看下下面的哪里出问题了?谢谢!************************************
Function(dwChannel,color,font_size : longint; Line1 ,Line2 : PWORD) : integer;stdcall;VAR
fData1 : PWORD ;
fData2 : PWORD ;
PSdk4000Func := GetProcAddress(FSdk4000Func,'EEoSetOsdDisplayMode') ;
if PSdk4000Func <> nil then begin
FunEEoSetOsdDisplayMode := TEEoSetOsdDisplayMode(PSdk4000Func);
GetMem(fData2,sizeof(WORD) * 20) ;
fData2^ := WindowFirIn.Height + 5 ;
INC(fData2) ;
fData2^ := WindowFirIn.Left + 5 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := 0 ;
iRet := FunEEoSetOsdDisplayMode(iTV1,10,80,fData2,fData2) ;
//FreeMem(fData2) ;
end;
******************************************
type
TFun= procedure(....);否则
type funname(....) ....external dllname;
if PSdk4000Func <> nil then begin
FunEEoSetOsdDisplayMode := TEEoSetOsdDisplayMode(PSdk4000Func);************************************************************
GetProcAddress(LoadLibrary的返回值, 函数名)他返回的是函数在进程中的地址。
看看msdn
Tfun=Function(dwChannel,color,font_size : longint; Line1 ,Line2 : PWORD;bAutoLight:Boolean) : integer;stdcall;VAR
fData1 : PWORD ;
fData2 : PWORD ;
PSdk4000Func:Tfun;
**************************
int CEEoServerDlg::Init()
{
int nRet = 0;
DWORD i;
// USHORT osdFormat1[] = {0,0, OSD_Year4, '-', OSD_Month2, '-', OSD_Day, ' ',
//OSD_Hour12, ':', OSD_Minute, ':', OSD_Second, ' ', 0};
// USHORT osdFormat1[] = {0,0, 0, 0, 0, 0,0, 0,
// 0, 0, 0, 0,0, 0, 0}; USHORT osdFormat1[] = {0,0, 0};
USHORT osdFormat2[] = {0, 0, '思','睿', '科', 0, '0', '0',0};
char szChannel[20]; GetWindowRect(&m_rcParent); if(!MTALoadLibrary(5000, WORK_AS_SERVER))
{
AfxMessageBox("To initialize net work sdk failed!");
}
else
{
if(!MTARegNotifier(&NetNotifierProc))
AfxMessageBox("To register net work notifier callback function failed!");
}
nRet = EEoInit();
if(nRet >= 0)
{
m_dwVideos = EEoGetTotalChannels();
if(m_dwVideos > 0)
{
DWORD k = m_dwVideos;
int nWidth, nHeight;
CRect rcClient; EEoEnableOverlay(FALSE); CreateButtons();
EEoSetVideoStandard(VS_PAL_BDGHI);//VS_NTSC
// for(i=0; i<m_dwVideos; i++)
/* EEoSetCaptureSize(0, 352, 288); // EEoSetCaptureSize(352, 288);
EEoSetCaptureSize(1, 704, 576);
EEoSetCaptureSize(2, 704, 576);
EEoSetCaptureSize(3, 704, 576);*/
// EEoSetCaptureSize(704, 576);
EEoSetVideoFormat(VF_YUY2);
m_VideoWnds = new CVideoWnd[m_dwVideos];
GetClientRect(&rcClient);
if(k>3)
k= (DWORD) sqrt((float)m_dwVideos);
if(k*k<m_dwVideos)
k= k+1; nWidth = (rcClient.Width() - 200) / k;
nHeight= (rcClient.Height()- 50) / k; EEoSetCaptureSize(/*704, 576*/352, 288);
for(i=0; i<m_dwVideos; i++)
{
rcClient.left = 1 + nWidth*(i%k);
rcClient.top = 1 + nHeight*(i/k);
rcClient.right = rcClient.left + nWidth - 1;
rcClient.bottom= rcClient.top + nHeight - 1;
m_VideoWnds[i].SetVideoIndex(i);
m_VideoWnds[i].Create(rcClient, this);
m_VideoWnds[i].GetClientRect(&rcClient);
// EEoSetCaptureSize(i, 704, 576);
// if(i % 4 == 1)
// {
// EEoSetCaptureSize(i, 640, 480);
// osdFormat2[0] = 640 - 85;
// osdFormat2[1] = 480 - 34;
// }
// else
{
osdFormat2[0] = 352 - 55;
osdFormat2[1] = 240 - 10;
}
wsprintf(szChannel, "%02d", i+1);
//osdFormat2[4] = szChannel[0];
//osdFormat2[5] = szChannel[1];
DWORD ki= EEoGetVideoSignal(i);
{
EEoSetFrameRate(i, 25);
EEoOpenChannel(i);
// EEoAssignFrameRate();
EEoSetEncoderParam(i, 1024000, 25);
EEoStartVideoPreview(i, m_VideoWnds[i].GetSafeHwnd(),&rcClient);
}
// else
{
// EEoCloseChannel(i);
} EEoSetupMotionDetection(i, 5, MotionAnalyzerProc, this);
//EEoSetOsdDisplayMode(i, RGB(255,255,255), /*(i%4 == 1) ? 32:*/50, osdFormat1, osdFormat2);
EEoSetOsdDisplayMode(i, 255, /*(i%4 == 1) ? 32:*/50, osdFormat1, osdFormat2); EEoSetOsd(i, 1);
EEoRegisterVideoStreamCallback(i, VideoStreamProc);
EEoRegisterVideoRawDataCallback(i, VideoRawStreamProc); // EEoRegisterAudioStreamCallback(i, AudioStreamProc);
// EEoStopVideoPreview(i);
((CButton*)GetDlgItem(IDC_CHK_PREVIEW+i))->SetCheck(TRUE);
}
m_VideoWnds[0].GetWindowRect(&m_rcLarge);
m_rcLarge.right = m_rcLarge.left + nWidth*k - 11;
m_rcLarge.bottom= m_rcLarge.top + nHeight*k - 11;
ScreenToClient(&m_rcLarge); m_dwAudio= EEoGetAudioDevNum(); for(i= 0; i<m_dwAudio; i++)
{
EEoRegisterAudioStreamCallback(i, AudioStreamProc);
}
}
/*else
{
GetDlgItem(IDC_BTN_START_RECORD_ALL)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_STOP_RECORD_ALL)->EnableWindow(FALSE);
}*/
}
else
{
GetDlgItem(IDC_BTN_START_RECORD_ALL)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_STOP_RECORD_ALL)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_DEFAULT)->EnableWindow(FALSE);
m_sldBright.EnableWindow(FALSE);
m_sldContrast.EnableWindow(FALSE);
m_sldHue.EnableWindow(FALSE);
m_sldSaturation.EnableWindow(FALSE);
GetDlgItem(IDC_BTN_SNAP)->EnableWindow(FALSE);
GetDlgItem(IDC_CHK_MOTION_DETECT)->EnableWindow(FALSE);
GetDlgItem(IDC_CHK_OSD)->EnableWindow(FALSE);
}
// EEoStartCaptureFile(0, "c:\\Videos\\0Video.avi");
// CFCreate(); return nRet;
}
int WINAPI EEoSetOsdDisplayMode(DWORD dwChannel, DWORD color, DWORD font_size, USHORT* Line1, USHORT* Line2);
*********************************
下面的是Delphi的函数定义:
TEEoSetOsdDisplayMode = Function(dwChannel,color,font_size : longint; Line1 ,Line2 : PInteger) : integer;stdcall;
下面是Delphi源程序:
var
iRet,rTV1,rTV2,iCount,oCount : integer;
sSQL : string ;
fData1 : PWORD ;
fData2 : PWORD ;
begin
PSdk4000Func := GetProcAddress(FSdk4000Func,'EEoSetOsdDisplayMode') ;
if PSdk4000Func <> nil then begin
FunEEoSetOsdDisplayMode := TEEoSetOsdDisplayMode(PSdk4000Func);
GetMem(fData1,SizeOf(PWORD)*10) ;
fData1^ := 0 ;
INC(fData1,2) ;
fData1^ := 0 ;
INC(fData1,2) ;
fData1^ := 0 ;
//FreeMem(fData1) ; //GetMem(fData2,SizeOf(WORD)*100) ;
GetMemory(SizeOf(fData2)*100);
fData2^ := 0 ;
INC(fData2) ;
fData2^ := 0 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := 0 ;
iRet := FunEEoSetOsdDisplayMode(iTV1,10,80,@fData1,@fData1) ;
FreeMem(fData1,SizeOf(WORD)*100) ;
FreeMem(fData2,SizeOf(WORD)*100) ;
end;
end;*********************************************************
这个函数USHORT*在Delphi中如何对应?
帮忙看下我上面的定义错在哪里?
编译可以通过,运行出虚拟地址错误。
指针定义不对吧--PWORD,这两指针你传入的是什么啊。
INC(fData1,2) ;
fData1^ := 0 ;
INC(fData1,2) ;
fData1^ := 0 ;
//FreeMem(fData1) ; //GetMem(fData2,SizeOf(WORD)*100) ;
GetMemory(SizeOf(fData2)*100);
fData2^ := 0 ;
INC(fData2) ;
fData2^ := 0 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := $BDF8 ;
INC(fData2) ;
fData2^ := 0 ;
iRet := FunEEoSetOsdDisplayMode(iTV1,10,80,@fData1,@fData1) ;
FreeMem(fData1,SizeOf(WORD)*100) ;
FreeMem(fData2,SizeOf(WORD)*100) ;
end;
end;
不要取地址了吧。后面那个fdata1是不是应该是fdata2啊。
WINAPI EEoSetOsdDisplayMode(DWORD dwChannel, DWORD color, DWORD font_size, USHORT* Line1, USHORT* Line2【, BOOL bAutoLight=FALSE】)
上次就指出了有缺省值的参数,也是需要定义的
这个参数去掉也不对,加上也不对。
不要取地址了吧,fdata1,fdata2本身已经是地址吧。getmem(fdata1,size)这个size是不是小于他DMEO里面传进去的SIZE哦。