'给你一段我以前写的比较完整的程序(改写过)。用MCI就可以了。
'一个picture1,1 个command1
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Declare Function mciGetErrorString Lib "winmm.dll" Alias "mciGetErrorStringA" (ByVal dwError As Long, ByVal lpstrBuffer As String, ByVal uLength As Long) As LongPrivate Sub OpenAVI(AVIFile As String, WhereShow As Control)
    Dim RVal As Long, X2 As Long, Y2 As Long
    Dim Alias As String, ReturnStr As String * 255, strLen As Long
    X2 = WhereShow.Width: Y2 = WhereShow.Height
    Alias = "MCIPannel2"
    RVal = mciSendString("stop " & Alias, vbNullString, 0, 0)
    RVal = mciSendString("close " & Alias, vbNullString, 0, 0)
    RVal = mciSendString("open " + AVIFile + " type AVIVideo alias " & Alias, vbNullString, 0, 0&)  '初始化设备
    If ErrHappen(RVal) Then Exit Sub
    RVal = mciSendString("window " & Alias & " handle " & WhereShow.hWnd, vbNullString, 0, 0&)
    RVal = mciSendString("put " & Alias & " destination at 0 0" & " " & X2 & " " & Y2, vbNullString, 0, 0&)
    
    strLen = 255
    Call mciSendString("status " & Alias & " Length", ReturnStr, strLen, 0)
    LenMCI = Val(ReturnStr) '得到总的帧数<===============
    MsgBox "片长:" & Round(LenMCI / 30, 2) & "秒" '每秒30帧
    
    RVal = mciSendString("play  " & Alias, vbNullString, 0, 0&)
    If ErrHappen(RVal) Then Exit Sub
End SubPrivate Sub Command1_Click()
    OpenAVI "F:\家庭档案\录像\20010414-3.avi", Picture1
End Sub
Private Sub Form_Load()
    Me.ScaleMode = 3
End Sub
Private Sub Form_Unload(Cancel As Integer)
    RVal = mciSendString("close " & Alias, vbNullString, 0, 0)
End Sub
Function ErrHappen(RVal As Long) As Boolean
    Dim ErrStr As String * 255, x As Long
    x& = mciGetErrorString(RVal, ErrStr, 255)
    If RVal <> 0 Then MsgBox ErrStr: ErrHappen = True
End Function