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;  

解决方案 »

  1.   

    FMPBuf1_OnCommand(  HWND  hWnd,  int  iID,  HWND  hWndCtl,  UINT  uiCodeNotify  ) ????返回值是怎么定义的??
      

  2.   

    to:Eastunfail
    整个是这样的:
    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;
    }
      

  3.   

    Translating....等下,马上铁上来
      

  4.   

    procedure FMPBuf1_OnCommand(hWnd:hwnd;iID:integer;hWndCtl:hwnd;uiCodeNotify:dword)
    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;
      

  5.   

    真是信你的邪~~~用SDK做,那多麻烦啊
      

  6.   

    to 恶鱼大哥
      我也是没办法呀,因为只有用BUF的播放方式才能解决我的问题,谢谢你了,如有问题
    还会打扰你的。谢谢了!
      

  7.   

    to 恶鱼大哥
      我知道您是高手,请到这里看看,我两处的分一起给你(200分)谢谢了
    http://expert.csdn.net/Expert/topic/1695/1695017.xml?temp=.6267664
      

  8.   

    to : 恶鱼杀手大哥
       FMPOpenStruct.dwCallBack := @FMPCallbackProc;
          这一句编译不过去。
       FMPCallbackProc是一个回调函数。
       你帮个忙,谢谢了
      

  9.   

    FMPOpenStruct.dwCallBack := DWORD(@FMPCallbackProc);
    哦~不好意思,没有看到dw前缀
      

  10.   

    其实你灭有必要一定要全部用SDK作,Delphi中又不是不可以使用API.
    Delphi应该用来设计界面。快些。而且免去了大量的处理消息的繁琐并且避免了因此带来的一些难以查找的Bug
      

  11.   

    to 恶鱼大哥:
       你好人作到底吧, 帮我把下面的回调函数也转一下,行吗 我会把两贴的分都给你(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 );
    }
      

  12.   

    看下这篇文章
    http://www.moonheaven.com/DownLoad/soft.asp?id=36希望对你有益
      

  13.   

    (*******************************************************************************
    *
    * 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;
      

  14.   

    to: 恶鱼大哥
        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;
      

  15.   

    这个。。
    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的定义
      

  16.   

    to: 恶鱼大哥
      我改为:
      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;
    呢?
      

  17.   

    哦~~~~是的。Delphi的定义没有错。。因为前面有个var修饰符。
    你需要多添加一个变量声明。
    在第一个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 );