WORD CALLBACK FMPCallbackProc( BYTE bMsg, BYTE hMPEGStream, DWORD dwValue )
以上是回调函数,以下是它的一个调用例子:
FMPBuf1_OnCommand( HWND hWnd, int iID, HWND hWndCtl, UINT uiCodeNotify )
{
switch( iID )
{
case IDM_OPEN:
{
FMP_OPEN_STRUCT FMPOpenStruct;
// stop and close any currently opened MPEG stream
if( ghMPEGStream )
{
FMPStop( ghMPEGStream );
FMPClose( ghMPEGStream );
ghMPEGStream = 0;
}
// select MPEG stream to open
if( !GetOpenFileName( (LPOPENFILENAME)&gOpenFileName ) )
{
return;
}
// open selected MPEG stream
memset( &FMPOpenStruct, '\0', sizeof( FMP_OPEN_STRUCT ) );
FMPOpenStruct.lpFileName = gOpenFileName.lpstrFile;
FMPOpenStruct.dwCallBack = (DWORD)FMPCallbackProc;
ghMPEGStream = (BYTE)FMPOpen( FMPF_BUFFERS, (DWORD)&FMPOpenStruct );
if( !ghMPEGStream )
{
MessageBox( hWnd, "File open error", "FMPBuf1 ERROR",
MB_ICONASTERISK ¦ MB_OK );
}
// set video keying mode
FMPSet( ghMPEGStream, FMPI_VID_KEY_MODE, FMPF_KEY_VGA );
// set video keying color
FMPSet( ghMPEGStream, FMPI_VID_KEY_COL, 0L );
// set video destination position
SendMessage( hWnd, WM_MOVE, 0, 0 );
// set video destination size
SendMessage( hWnd, WM_SIZE, 0, 0 );
break;
整个是这样的:
void
FMPBuf1_OnCommand( HWND hWnd, int iID, HWND hWndCtl, UINT uiCodeNotify )
{
switch( iID )
{
case IDM_ABOUT:
DialogBox( ghInstance, MAKEINTRESOURCE( RM_ABOUTBOX ), hWnd,
(DLGPROC)AboutBoxProc );
break; case IDM_OPEN:
{
FMP_OPEN_STRUCT FMPOpenStruct; // stop and close any currently opened MPEG stream
if( ghMPEGStream )
{
FMPStop( ghMPEGStream );
FMPClose( ghMPEGStream );
ghMPEGStream = 0;
} // select MPEG stream to open
if( !GetOpenFileName( (LPOPENFILENAME)&gOpenFileName ) )
{
return;
} // open selected MPEG stream
memset( &FMPOpenStruct, '\0', sizeof( FMP_OPEN_STRUCT ) );
FMPOpenStruct.lpFileName = gOpenFileName.lpstrFile;
FMPOpenStruct.dwCallBack = (DWORD)FMPCallbackProc;
ghMPEGStream = (BYTE)FMPOpen( FMPF_BUFFERS, (DWORD)&FMPOpenStruct );
if( !ghMPEGStream )
{
MessageBox( hWnd, "File open error", "FMPBuf1 ERROR",
MB_ICONASTERISK | MB_OK );
} // set video keying mode
FMPSet( ghMPEGStream, FMPI_VID_KEY_MODE, FMPF_KEY_VGA ); // set video keying color
FMPSet( ghMPEGStream, FMPI_VID_KEY_COL, 0L ); // set video destination position
SendMessage( hWnd, WM_MOVE, 0, 0 ); // set video destination size
SendMessage( hWnd, WM_SIZE, 0, 0 );
break;
}
var FMPOpenStruct:FMP_OPEN_STRUCT;
begin
case iID of
IDM_ABOUT:
begin
DialogBox( ghInstance, MAKEINTRESOURCE( RM_ABOUTBOX ), hWnd,
(DLGPROC)AboutBoxProc ); //这里没有改,因为你这里是打开保存在资源中的对话框,而Delphi采用的VCL封装的对话框,你若是要改就得自己用Delphi设计界面。
end;
IDM_OPEN:
begin
// stop and close any currently opened MPEG stream
if ghMPEGStream<>0 Then
begin
FMPStop( ghMPEGStream );
FMPClose( ghMPEGStream );
ghMPEGStream: = 0;
end; // select MPEG stream to open
if GetOpenFileName( gOpenFileName )=0 then exit; // open selected MPEG stream
ZeroMemory(@FMPOpenStruct,sizeof(FMPOpenStruct));
FMPOpenStruct.lpFileName := gOpenFileName.lpstrFile;
FMPOpenStruct.dwCallBack := @FMPCallbackProc;
ghMPEGStream := BYTE(FMPOpen( FMPF_BUFFERS, FMPOpenStruct ));//如果FMPOpen的第二个参数采用了 var 修饰符就用前面写的,否则若是传入指针则 @FMPOpenStruct,如果是DWORD类型则 DWORD(@FMPOpenStruct)
if ghMPEGStream=0 then
begin
MessageBox( hWnd, "File open error", "FMPBuf1 ERROR",
MB_ICONASTERISK | MB_OK );
end; // set video keying mode
FMPSet( ghMPEGStream, FMPI_VID_KEY_MODE, FMPF_KEY_VGA ); // set video keying color
FMPSet( ghMPEGStream, FMPI_VID_KEY_COL, 0 ); // set video destination position
SendMessage( hWnd, WM_MOVE, 0, 0 ); // set video destination size
SendMessage( hWnd, WM_SIZE, 0, 0 );
end;
end;//End for Case
end;
我也是没办法呀,因为只有用BUF的播放方式才能解决我的问题,谢谢你了,如有问题
还会打扰你的。谢谢了!
我知道您是高手,请到这里看看,我两处的分一起给你(200分)谢谢了
http://expert.csdn.net/Expert/topic/1695/1695017.xml?temp=.6267664
FMPOpenStruct.dwCallBack := @FMPCallbackProc;
这一句编译不过去。
FMPCallbackProc是一个回调函数。
你帮个忙,谢谢了
哦~不好意思,没有看到dw前缀
Delphi应该用来设计界面。快些。而且免去了大量的处理消息的繁琐并且避免了因此带来的一些难以查找的Bug
你好人作到底吧, 帮我把下面的回调函数也转一下,行吗 我会把两贴的分都给你(200分),我也是没法子,谢谢了。
/*******************************************************************************
*
* FUNCTION : FMPCallbackProc()
*
* DESCRIPTION : FMP callback function.
*
* PARAMETERS : bMsg - callback message
* hMPEGStream - handle to MPEG stream
* dwValue - value passed to callback
*
* RETURN : 0 - success
* FMPE_DOS - error encountered
*
* COMMENTS : NONE
*
*******************************************************************************/WORD CALLBACK FMPCallbackProc( BYTE bMsg, BYTE hMPEGStream, DWORD dwValue )
{ int i; struct TBuf *Buf;
Buf= (struct TBuf *)FMPGet( hMPEGStream, FMPI_STM_USER); switch( bMsg )
{
// first message received - make all your allocations here
case FMPM_BUF_CREATE:
//DWORD dwIndex;
Buf = (struct TBuf *)GlobalAllocPtr( GMEM_FIXED, sizeof( struct TBuf ) );
if( !Buf )
{
MessageBox(NULL,"Error while allocating TBuf",
"FMPBuf1::FMPCallbackProc()",
MB_ICONASTERISK | MB_OK );
return( FMPE_DOS );
}
memset( Buf, '\0', sizeof( struct TBuf ) ); // Value is the parameter passed when opening the file( ie. filename )
Buf->hFile = CreateFile(((FMP_OPEN_STRUCT *)dwValue)->lpFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, 0 );
// if we cannot open the file, return an error
// NOTE: the FMPM_BUF_CLOSE is not called when an error occurs
// during the creation
if( Buf->hFile == INVALID_HANDLE_VALUE )
{
MessageBox( NULL,
"Error While Opening File",
"FMPBuf1::FMPCallbackProc()",
MB_ICONASTERISK | MB_OK );
GlobalFreePtr( Buf );
return( FMPE_DOS );
}
for( i = 0; i < MAX_BUF_NUMBER; i++ )
{
Buf->Buffer[i] = (char *)GlobalAllocPtr( GMEM_FIXED, MAX_BUF_SIZE + 2 );
}
Buf->wIndex = 0;
Buf->dwSize = 0; // store the structure address in the USER field
FMPSet(hMPEGStream,FMPI_STM_USER, (DWORD)Buf ); // trigger at 3/4 of the buffer to fill the next buffer
FMPSet(hMPEGStream, FMPI_BUF_POS, (DWORD)((float)MAX_BUF_SIZE * (float).75));
break;
// message received when closing the stream - delete buffers
case FMPM_BUF_CLOSE:
// close the file
CloseHandle( Buf->hFile ); // free all application buffers
for( i = 0; i < MAX_BUF_NUMBER; i++ )
{
GlobalFreePtr( Buf->Buffer[i] );
}
GlobalFreePtr( Buf );
break; // message received when a seek is required - seek to the position
// in Value (specified in bytes)
case FMPM_BUF_SEEK:
SetFilePointer( Buf->hFile, (LONG)dwValue, 0, FILE_BEGIN );
break; // message received when a buffer has reached its signal position -
// prepare here the next buffer
case FMPM_BUF_POS:
ReadFile( Buf->hFile, Buf->Buffer[Buf->wIndex], MAX_BUF_SIZE,
&Buf->dwSize, NULL );
break; // message received when a buffer has been completely read - switch to
// the next prepared buffer
case FMPM_BUF_EMPTY:
FMPSet(hMPEGStream, FMPI_BUF_SIZE, Buf->dwSize );
FMPSet(hMPEGStream, FMPI_BUF_ADDRESS, (DWORD)(Buf->Buffer[Buf->wIndex]));
//FMPSet( ghMPEGStream, FMPI_BUF_HANDLE, (DWORD)Buf->BufferIndex[Buf->wIndex] );
Buf->wIndex++;
Buf->wIndex %= MAX_BUF_NUMBER;
break; case FMPM_ERROR:
break;
}
return( 0 );
}
http://www.moonheaven.com/DownLoad/soft.asp?id=36希望对你有益
*
* FUNCTION : FMPCallbackProc()
*
* DESCRIPTION : FMP callback function.
*
* PARAMETERS : bMsg - callback message
* hMPEGStream - handle to MPEG stream
* dwValue - value passed to callback
*
* RETURN : 0 - success
* FMPE_DOS - error encountered
*
* COMMENTS : NONE
*
********************************************************************************)function FMPCallbackProc( BYTE bMsg, BYTE hMPEGStream, DWORD dwValue ):word;stdcall;
type
PBuf=^TBuf;
PFMP_OPEN_STRUCT=^FMP_OPEN_STRUCT;
var
i:integer;
Buf:PBuf;
begin
Buf:= PBuf(FMPGet( hMPEGStream, FMPI_STM_USER));
case bMsg of
// first message received - make all your allocations here
FMPM_BUF_CREATE:
begin
//DWORD dwIndex;
Buf := PBuf(GlobalAllocPtr( GMEM_FIXED, sizeof(TBuf ) ));
if Not Assigned(Buf) Then
begin
MessageBox(0,"Error while allocating TBuf","FMPBuf1::FMPCallbackProc()",MB_ICONASTERISK | MB_OK );
Result:=FMPE_DOS;
exit;
end;
ZeroMemory(Buf,sizeof(TBuf);
// Value is the parameter passed when opening the file( ie. filename )
Buf^.hFile := CreateFile((PFMP_OPEN_STRUCT(dwValue))^.lpFileName, GENERIC_READ, FILE_SHARE_READ,
nil, OPEN_EXISTING, 0, 0 );
// if we cannot open the file, return an error
// NOTE: the FMPM_BUF_CLOSE is not called when an error occurs
// during the creation
if( Buf^.hFile = INVALID_HANDLE_VALUE ) then
begin
MessageBox( 0,"Error While Opening File","FMPBuf1::FMPCallbackProc()",MB_ICONASTERISK | MB_OK );
GlobalFreePtr( Buf );
Result:= FMPE_DOS ;
exit;
end;
{不太清楚你的TBuf是如何定义的。 }
{如果有错误就将下面一句改为 for i := 1 To MAX_BUF_NUMBER do}
for i := 0 To MAX_BUF_NUMBER-1 do
Buf^.Buffer[i] = pChar(GlobalAllocPtr( GMEM_FIXED, MAX_BUF_SIZE + 2 ));
Buf^.wIndex = 0;
Buf^.dwSize = 0;
// store the structure address in the USER field
FMPSet(hMPEGStream,FMPI_STM_USER, DWORD(Buf));
// trigger at 3/4 of the buffer to fill the next buffer
FMPSet(hMPEGStream, FMPI_BUF_POS, DWORD(MAX_BUF_SIZE * .75));
end;{End for case 'FMPM_BUF_CREATE'}
// message received when closing the stream - delete buffers
FMPM_BUF_CLOSE:
begin
// close the file
CloseHandle( Buf^.hFile );
// free all application buffers
{不太清楚你的TBuf是如何定义的。 }
{如果有错误就将下面一句改为 for i := 1 To MAX_BUF_NUMBER do}
for i := 0 To MAX_BUF_NUMBER -1 do
GlobalFreePtr( Buf^.Buffer[i] );
GlobalFreePtr( Buf );
end;{End for case 'FMPM_BUF_CLOSE'} // message received when a seek is required - seek to the position
// in Value (specified in bytes)
FMPM_BUF_SEEK:
SetFilePointer( Buf^.hFile, integer(dwValue), 0, FILE_BEGIN );
// message received when a buffer has reached its signal position -
// prepare here the next buffer
FMPM_BUF_POS:
ReadFile( Buf^.hFile, Buf^.Buffer[Buf^.wIndex], MAX_BUF_SIZE,
@(Buf^.dwSize), nil ); // message received when a buffer has been completely read - switch to
// the next prepared buffer
FMPM_BUF_EMPTY:
begin
FMPSet(hMPEGStream, FMPI_BUF_SIZE, Buf^.dwSize );
FMPSet(hMPEGStream, FMPI_BUF_ADDRESS, (DWORD)(Buf^.Buffer[Buf^.wIndex]));
//FMPSet( ghMPEGStream, FMPI_BUF_HANDLE, (DWORD)Buf->BufferIndex[Buf->wIndex] );
Inc(Buf^.wIndex);
Buf^.wIndex :=Buf^.wIndex mod MAX_BUF_NUMBER;
end;{End for case 'FMPM_BUF_EMPTY'} FMPM_ERROR:
end; {End for case statement}
Result:=0;
end;
FMPM_BUF_POS:
ReadFile( Buf^.hFile, Buf^.Buffer[Buf^.wIndex], MAX_BUF_SIZE,
@(Buf^.dwSize), nil );
这一句无法编译,我去掉@后可以编译过去。但结果不对,您看看这是怎么回事?
另外对BUF和PFMP_OPEN_STRUCT的定义如下:PFMP_OPEN_STRUCT = ^TFMP_OPEN_STRUCT;
TFMP_OPEN_STRUCT = record
lpFileName: LPTSTR;
dwCallBack: DWORD;
Reserved : array[0..7] of Byte;
end; PBuffer = ^Byte;
PBuf= ^TBuf;
TBuffer = array[0..MAX_BUF_NUMBER - 1] of PBuffer;
TBuf = record
hFile : THandle;
dwSize: DWORD;
wIndex: WORD;
Buffer: TBuffer;
BufferIndex: array[0..MAX_BUF_NUMBER- 1] of DWord;
end;
ReadFile在Delphi中定义的是:
function ReadFile(hFile: THandle; var Buffer; nNumberOfBytesToRead: DWORD;
var lpNumberOfBytesRead: DWORD; lpOverlapped: POverlapped): BOOL; stdcall;
但是在Win32 Programmer's Reference中却为:
BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD NumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
lpNumberOfBytesRead一个为DWORD,一个为指向DWORD类型的指针迷惑~但是根据土耳其命名法,Delphi的声明应该错了。
你可以改为:
ReadFile( Buf^.hFile, Buf^.Buffer[Buf^.wIndex], MAX_BUF_SIZE, DWORD(@(Buf^.dwSize)), nil );
或者修改ReadFile的定义
我改为:
ReadFile( Buf^.hFile, Buf^.Buffer[Buf^.wIndex], MAX_BUF_SIZE, DWORD(@(Buf^.dwSize)), nil );
还是不行呀!
如何修改function ReadFile(hFile: THandle; var Buffer; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: POverlapped): BOOL; stdcall;
呢?
你需要多添加一个变量声明。
在第一个begin前面var后面加上:
NumberOfBytes:DWORD;然后
ReadFile( Buf^.hFile, Buf^.Buffer[Buf^.wIndex], MAX_BUF_SIZE, DWORD(@(Buf^.dwSize)), nil );改为
NumberOfBytes:=DWORD(@(Buf^.dwSize));
ReadFile( Buf^.hFile, Buf^.Buffer[Buf^.wIndex], MAX_BUF_SIZE,NumberOfBytes , nil );