Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPrivate Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As LongPrivate Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As LongPrivate Declare Function CallWindowProc Lib "USER32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Sub Command1_Click()
'Dim l As String
'Dim light As Integer, dark As Integer
'Call USB_READ
''l = USB_READ(light, dark)
'Print light, dark
Dim DllHand As Long
Dim a As Long, b As Long
Dim DllProc As Long'ChDrive App.Path '用来改变驱动器到指定的有说要dll的驱动器
ChDir App.Path  '这一句是将路径指向dll所在的目录
DllHand = LoadLibrary("USB.dll")
If DllHand = 0 Then MsgBox "没法加载DLL,请先将该工程保存重新启动程序!": Exit Sub
DllProc = GetProcAddress(DllHand, "USB_READ")
If DllProc = 0 Then MsgBox "没找到此函数,请先将该工程保存重新启动程序!": Exit Sub
CallWindowProc DllProc, DllHand, a, b, 0
' 执行你的DLL的函数
'Call USB_READ
FreeLibrary DllHand '释放DLL
End Sub

解决方案 »

  1.   

    CallWindowProc这样调用是干什么的?a,b是什么来的?
    你是要把窗体子类化么?要先SetWindowLong“导出”WindowProc啊
      

  2.   

    callwindowproc只能调用参数为空或者为4个dword长度的函数.callwindowproc在push参数之前首先push &HDCBAABCD
    在调用后会用当前栈跟&HDCBAABCD比较, 如果相同则直接返回, 否则自己ret10h.而且你的函数是2个DWORD, 那么callwindowsproc最后还是ret10h, 一共是ret18h了.
    栈平不了.当然调用失败.PUSH DCBAABCD
    PUSH ESI
    PUSH DWORD PTR SS:[EBP+18]
    PUSH DWORD PTR SS:[EBP+14]
    PUSH DWORD PTR SS:[EBP+10]
    PUSH DWORD PTR SS:[EBP+C]
    MOV EAX,DWORD PTR FS:[18]
    OR BYTE PTR DS:[EAX+FB8],1
    CALL DWORD PTR SS:[EBP+8]
    MOV ECX,DWORD PTR FS:[18]
    AND BYTE PTR DS:[ECX+FB8],0
    CMP DWORD PTR SS:[ESP+4],DCBAABCD
    JNZ USER32.77E43844  ...(1)
    (2).....
    (1)
    CMP DWORD PTR SS:[ESP],DCBAABCD
    JNZ SHORT USER32.77E43855
    SUB ESP,4
    JMP USER32.77E2C3D3           ...(2)
    ADD ESP,10
    JMP USER32.77E2C3D3           ...(2)
      

  3.   

    不好意思,是我没写明白
    具体如下:
    Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
    Private Declare Function CallWindowProc Lib "USER32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Sub Command1_Click()
    Dim DllHand As Long
    Dim a As Long, b As Long
    Dim DllProc As LongDllHand = LoadLibrary("USB.dll")
    If DllHand = 0 Then MsgBox "没法加载DLL,请先将该工程保存重新启动程序!": Exit Sub
    DllProc = GetProcAddress(DllHand, "USB_READ")
    If DllProc = 0 Then MsgBox "没找到此函数,请先将该工程保存重新启动程序!": Exit Sub
    CallWindowProc DllProc, DllHand, a, b,0   '(a,b是我自己定义的)
    FreeLibrary DllHand '释放DLL
    End Sub注:在USB.dll中有一个函数 USB_READ(double *data,double*dark),我是想通过调用该函数获得data 和dark的数据,这些数据是通过USB连接的探头传上来的,但还不知道怎么把这些数据导出来,本以为定义a ,b 就能将数据导到a ,b 中的,可事实告诉我错了,呵呵。本人是想要对这些数据进行处理的,但不知道哪里出错了,还请指点下,如有需要什么资料可留下邮箱地址。谢谢
      

  4.   

    CallWindowProc ???好象它不是那样用的吧?你想动态调用DLL内的函数的话,好象应该用CreateThread哦??如果没有必要,还是不要动态调用函数吧................