VC:
======================================
typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;typedef struct tagBITMAPCOREINFO {
    BITMAPCOREHEADER    bmciHeader;
    RGBTRIPLE           bmciColors[1];
} BITMAPCOREINFO, FAR *LPBITMAPCOREINFO, *PBITMAPCOREINFO;__declspec(dllexport)   BOOL __stdcall  MV_AVIFileOpen(int index,LPCTSTR lpszFileName, LPBITMAPINFO alpb, WORD wSkipRate);---------------------------------------------------------------
m_pImageInfo = (BITMAPINFO *) new BYTE[sizeof( BITMAPINFO ) + 
(256 * sizeof( RGBQUAD )) ];
if ( m_pImageInfo == NULL ) return ;
m_pImageInfo->bmiHeader.biSize          = sizeof( BITMAPINFOHEADER );
m_pImageInfo->bmiHeader.biWidth         = info.Width;
m_pImageInfo->bmiHeader.biHeight        = info.Heigth;
m_pImageInfo->bmiHeader.biPlanes        = 1;
m_pImageInfo->bmiHeader.biBitCount      = info.nColor;
m_pImageInfo->bmiHeader.biCompression   = BI_RGB;
m_pImageInfo->bmiHeader.biSizeImage     = info.Length;
m_pImageInfo->bmiHeader.biXPelsPerMeter = 0;
m_pImageInfo->bmiHeader.biYPelsPerMeter = 0;
m_pImageInfo->bmiHeader.biClrUsed       = (info.nColor <= 8) ? 256 : 0;
m_pImageInfo->bmiHeader.biClrImportant  = (info.nColor <= 8) ? 256 : 0;
if(info.nColor==8)
{
for (UINT i = 0; i < 256; i++ ) 
{
m_pImageInfo->bmiColors[i].rgbBlue  = (BYTE) 0;
m_pImageInfo->bmiColors[i].rgbGreen = (BYTE) 0;
m_pImageInfo->bmiColors[i].rgbRed   = (BYTE) i;
m_pImageInfo->bmiColors[i].rgbReserved  = 0;
}
}
char AviFileName[256];
sprintf(AviFileName,"cap%d.avi",FileIndex);
BOOL bOpen=MV_AVIFileOpen(0, AviFileName, m_pImageInfo, 1);
======================================
VB:
Public Type RGBQUAD
        rgbBlue As Byte
        rgbGreen As Byte
        rgbRed As Byte
        rgbReserved As Byte
End TypePublic Type BITMAPINFO
  bmiHeader As BITMAPINFOHEADER
  bmiColors(0 To 256) As RGBQUAD
End TypePublic Const BI_RGB = &H0Public Declare Function MV_AVIFileOpen Lib "MVAVI.dll" (ByVal Index As Integer, ByVal lpszFileName As String, alpb As BITMAPINFO, wSkipRate As Integer) As Boolean
    Dim ImageInfo As BITMAPINFO
    'MsgBox LenB(ImageInfo)
    ImageInfo.bmiHeader.biSize = 40
    ......
    
    Dim bOpen As Boolean
    Dim fname As String
    fname = "tmp1.avi"
    bOpen = MV_AVIFileOpen(0, fname, ImageInfo, 1)或者是:
Public Declare Function MV_AVIFileOpen Lib "MVAVI.dll" (ByVal Index As Integer, ByVal lpszFileName As String,ByVal alpb As Long, wSkipRate As Integer) As BooleanLong改成Any也不行bOpen = MV_AVIFileOpen(0, fname,byval VarPtr(ImageInfo), 1)

解决方案 »

  1.   

     MV_AVIFileOpen 函数来自威视V130采集卡开发包中的 mvavi.dll
      

  2.   

    应该是VB调用外部DDL的声明有问题,主要是C参数转VB参数有问题。
    但哪里有问题我也说不出,最好向V130开发商要一个VB的进程调用MV_AVIFileOpen的例程。
      

  3.   

    vc中的integer到VB中必须用long
    类型的指针最好也用long
      

  4.   

    Option ExplicitPrivate Type RGBQUAD
            rgbBlue As Byte
            rgbGreen As Byte
            rgbRed As Byte
            rgbReserved As Byte
    End TypePrivate Type BITMAPINFOHEADER
            biSize As Long
            biWidth As Long
            biHeight As Long
            biPlanes As Integer
            biBitCount As Integer
            biCompression As Long
            biSizeImage As Long
            biXPelsPerMeter As Long
            biYPelsPerMeter As Long
            biClrUsed As Long
            biClrImportant As Long
    End TypePrivate Type BITMAPINFO
      bmiHeader As BITMAPINFOHEADER
      bmiColors(0 To 256) As RGBQUAD
    End TypePrivate Const BI_RGB = &H0
    Private Declare Function MV_AVIFileOpen Lib "D:\Smart\vc\test8\Debug\test8.dll" (ByVal Index As Long, ByVal lpszFileName As String, ByVal alpb As Long, ByVal wSkipRate As Integer) As LongPrivate Sub Command1_Click()
        Dim ImageInfo As BITMAPINFO
        With ImageInfo
            .bmiHeader.biSize = 40
            .bmiHeader.biBitCount = 88
            .bmiHeader.biHeight = 99
        End With
         
        Dim bOpen As Boolean
        Dim fname As String
        fname = "testfdsafdsafdsatmp1.avi"
        bOpen = MV_AVIFileOpen(&H1234, fname, VarPtr(ImageInfo), &H1122)
    End Sub俺写了个测试,在vc下debug跟踪没问题,传进来的都正确。
      

  5.   

    谢谢回复,我现在不用他的函数了,mvavi.dll中还是用的VFW,直接调用VFW API还灵活些不过有新的问题,我在采集完一帧的回调函数中使用AVIStreamWrite,但是采集的帧大小(就是高和宽)可能会经常发生变化,而建立流的时候就指定了图像大小
        With aviSI
            .fccType = mmioStringToFOURCC("vids", 0&)     '// stream type video
            .fccHandler = 0&                             '// default AVI handler
            .dwScale = 1
            .dwRate = 25                                 '// fps(1-30)
            .dwSuggestedBufferSize = bInfo.bmiHeader.biSizeImage       '// size of one frame pixels
            Call SetRect(.rcFrame, 0, 0, bInfo.bmiHeader.biWidth, bInfo.bmiHeader.biHeight)             '// rectangle for stream
        End With
    '   create the stream
        r = AVIFileCreateStream(pFile, ps, aviSI)怎样在回调函数中进行处理呢,不会每次在回调函数中销毁流再重建吧?
    由于图像大小变化了,会引起指针越界的非法操作
      

  6.   

    我另外开了个帖子,并贴出了代码,请大家继续讨论
    http://topic.csdn.net/u/20080326/21/de484afd-ad90-48a0-938c-e3f8d6d8484d.html?seed=581811851