高分求助!急,在线等待 VC++的程序转成DELPHI,分不够可再加!(150分)

S

shuang

Unregistered / Unconfirmed
GUEST, unregistred user!
C++里的函数:
Hik_PlayM4_SetFileRefCallBack(LONG nPort, void (__stdcall *pFileRefDone)(DWORD nPort,DWORD nUser),DWORD nUser);设置回调函数指针,文件索引建立后回调。为了能在文件中准确快速的定位,我们在文件打开的时候生成文件索引
输入参数:
SetFileRefCallBack:回调函数指针
nUser:用户数据
回调函数声明 Void fileRefDone(DWord nPort,Dword nUser)
参数说明:nPort播放器通道号
nUser用户数据
说明:它是多媒体播放器中的一个在文件打开后播放之前用的一个
建立索引的函数,建立索引的目的是为了可以实现,可以任意指定时间点进行播放。
这是播放器程序(VC++)的一部分
//完成文件索引回调函数
void CALLBACK FileRefDone(DWORD nReserved,DWORD nUser);
/////////////////////////////////////////////////////////////////////////////
//功能:打开文件
////////////////////////////////////////////////////////////////////////////
void CPlayerDlg::OnFileOpen()
{
//如果已经打开,则先关闭;
if(m_bOpen)
{
if(m_bStreamType)
CloseStream();
else
CloseFile();
}
if(!BrowseFile(&m_strPlayFileName))
return;
if(m_bStreamType)
OpenStream();
else
OpenFile();

}
void CPlayerDlg::OpenFile()
{
TRACE("Open fileNAME IS:%s",m_strPlayFileName);
//生成文件索引;
Hik_PlayM4_SetFileRefCallBack(PORT,FileRefDone,(DWORD)this);
if(!Hik_PlayM4_OpenFile(PORT,m_strPlayFileName.GetBuffer(m_strPlayFileName.GetLength())))
{
m_strPlayFileName="";
CString csError;
csError.Format("文件打不开(%d)",Hik_PlayM4_GetLastError(PORT));
MessageBox(csError);
return ;
}
SetOpenState();
m_nMaxFileTime=Hik_PlayM4_GetFileTime(PORT);
if(!m_nMaxFileTime)
{
MessageBox("文件总时间为0");
return;
}
m_nTotalHour=m_nMaxFileTime/3600;
m_nTotalMinute=(m_nMaxFileTime%3600)/60;
m_nTotalSecond=m_nMaxFileTime%60;
m_nTotalFrames=Hik_PlayM4_GetFileTotalFrames(PORT);
//如果要设置在此设置;
//Hik_PlayM4_SetDisplayBuf(PORT,25);
Play();

}
////////////////////////////////////////////////////////////////////////
//功能:文件索引完成后回调此函数,通知用户可以使用相关接口
///////////////////////////////////////////////////////////////////////
void CALLBACK FileRefDone(DWORD nReserved,DWORD nUser)
{
CPlayerDlg* pOwner=(CPlayerDlg*)nUser;
pOwner->m_bFileRefCreated=TRUE;
pOwner->ChangeUI();
}
//////////////////////////////////////////////////////////////////////////
//功能:文件索引完成后,改变界面;
//////////////////////////////////////////////////////////////////////////
void CPlayerDlg::ChangeUI()
{
if(m_bFileRefCreated)
{
CButton *pButton;
pButton = (CButton *)GetDlgItem(IDC_STEPBACK);
pButton->EnableWindow(TRUE);

m_pMainMenu->EnableMenuItem(ID_CUT_FILE,MF_ENABLED);
m_pMainMenu->EnableMenuItem(ID_SEEK,MF_ENABLED);
}
}

请问
(1)声明部分:
void CALLBACK FileRefDone(DWORD nReserved,DWORD nUser);
void CALLBACK FileRefDone(DWORD nReserved,DWORD nUser)
{
CPlayerDlg* pOwner=(CPlayerDlg*)nUser;
pOwner->m_bFileRefCreated=TRUE;
pOwner->ChangeUI();
}
(2)调用部分:
void CPlayerDlg::OpenFile()
{
TRACE("Open fileNAME IS:%s",m_strPlayFileName);
//生成文件索引;
Hik_PlayM4_SetFileRefCallBack(PORT,FileRefDone,(DWORD)this);
.........
}
请教高手在delphi中如何用?
我是这样写的总是报该程序执行非法操作,很苦恼!
type


PpFileRefDone = function(nPort:integer;
nUser: word): integer;
stdcall;//procedure(nPort: Real;
nUser: real);
stdcall;
function PlayM4_SetFileRefCallBack(nPort: integer;
pFileRefDone: PpFileRefDone;
nUser: word): Boolean;
stdcall;

private
Function pFileRefDone(nPort:real;
nUser: real): integer;
stdcall;
public
{ Public declarations }
end;

var
RefDone:string;//='1'表示索引建立完成
Function TForm_af_jk.pFileRefDone(nPort:real;
nUser: real): integer;
stdcall;
begin
RefDone:='1';
// ChangeUI;
end;

procedure TForm_af_jk.SBtn_playClick(Sender: TObject);
var frd: PpFileRefDone;
begin
//先关再开
PlayM4_stop(1);

PlayM4_closeFile(1);
// PlayM4_RealeseDDraw();
if edit1.text='' then
begin
showmessage('请选择录像文件');
exit;
end;

if not FileExists(edit1.text+'.mpg') then
begin

showmessage('此录像文件不存在');
exit;
end;

PlayM4_OpenFile(1,edit1.text+'.mpg');
//建立索引
PlayM4_SetFileRefCallBack(1, frd,0);
// PlayM4_RefreshPlay(1);
PlayM4_Play(1,Form_af_jk.Panel1.handle);

if RefDone='1' then
showmessage('111');
end;

 
procedure FileRefDone(nPort, nUser: dword);
stdcall;
begin
RefDone := '1';
TForm_af_jk(nUser).ChangeUI;
end;

procedure TForm_af_jk.SBtn_playClick(Sender: TObject);
begin
...
PlayM4_SetFileRefCallBack(1, @FileRefDone, dword(Self));
...
end;
 
weiwei81123,
程序通不过
 
type


PpFileRefDone = function(nPort:integer;
nUser: word): integer;
stdcall;//procedure(nPort: Real;
nUser: real);
stdcall;
function PlayM4_SetFileRefCallBack(nPort: integer;
pFileRefDone: PpFileRefDone;
nUser: word): Boolean;
stdcall;

private
Function pFileRefDone(nPort:real;
nUser: real): integer;
stdcall;
public
{ Public declarations }
end;

var
RefDone:string;//='1'表示索引建立完成
function MyPpFileRefDone = function(nPort:integer;
nUser: word): integer;
stdcall;
begin
//定义自己的处理函数
end;

Function TForm_af_jk.pFileRefDone(nPort:real;
nUser: real): integer;
stdcall;
begin
RefDone:='1';
// ChangeUI;
end;

procedure TForm_af_jk.SBtn_playClick(Sender: TObject);
begin
//先关再开
PlayM4_stop(1);

PlayM4_closeFile(1);
// PlayM4_RealeseDDraw();
if edit1.text='' then
begin
showmessage('请选择录像文件');
exit;
end;

if not FileExists(edit1.text+'.mpg') then
begin

showmessage('此录像文件不存在');
exit;
end;

PlayM4_OpenFile(1,edit1.text+'.mpg');
//建立索引
PlayM4_SetFileRefCallBack(1, @MyPpFileRefDone,0);
// PlayM4_RefreshPlay(1);
PlayM4_Play(1,Form_af_jk.Panel1.handle);

if RefDone='1' then
showmessage('111');
end;

 
类似的问题你可以看看delphi是如何封装windows API的
比如 SetWindowsHook
 
哪儿不对?不要告诉我TForm_af_jk(nUser).ChangeUI通不过
 
weiwei81123的确如你所说的 TForm_af_jk(nUser).ChangeUI通不过
 
晕,这个函数你自己定义啊,不需要做什么的话删掉好了。
 
真不好意思,我写的那段程序我也不知对不对,大家不要看我的那段了,就看VC++的那段然后看看在delphi里如何实现吧!谢谢啦
 
顶部