vc写的dll有def文件,单独的去调用它没有问题,但是在一个多界面窗体中,用不同的界面调用不同的dll,dll也在不同的文件夹下,程序运行,启动任何一个界面调用与其相应的dll都没有问题,但是在主程序不退出的情况下,再启动其它子窗体调用与其相应的dll就会出现找不到dll的错误。
注:chdir已经用过

解决方案 »

  1.   

    如果实在是搞不明白的话,还可以不声明函数,直接用LoadLibrary加载dll,然后用 GetProcAddress、CallWindowProc调用api函数,下面是一个简单的例子:
    Create a new project and add this code to Form1
    Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
    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 CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
    Private Sub Form_Load()
        On Error Resume Next
        'KPD-Team 1999
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        'We're going to call an API-function, without declaring it!
        Dim lb As Long, pa As Long
        'map 'user32' into the address space of the calling process.
        Lb = LoadLibrary("user32")
        'retrieve the address of 'SetWindowTextA'
        pa = GetProcAddress(lb, "SetWindowTextA")
        'Call the SetWindowTextA-function
        CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
        'unmap the library's address
        FreeLibrary lb
    End Sub
      

  2.   

    问rainstormmaster(暴风雨 v2.0) ,DLL库中所有的函数都能用CallWindowProc 执行吗?请给个例子吧。
      

  3.   

    //DLL库中所有的函数都能用CallWindowProc 执行吗这个要看函数的调用约定,如果是stdcall的,直接像我上面写的那样即可,如果不是,一般需要用内联汇编实现,至于代码,你用google搜索一下即可
    而dll如果是activex dll的话,其动态调用的方法就要另说了,如果,想知道的话,回帖
      

  4.   

    rainstormmaster(暴风雨 v2.0) :这种方法我试了还是不行
    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
    Dim DllHand As Long
    Dim DllProc As Long
        ChDrive App.Path    '用来改变驱动器到指定的有说要dll的驱动器
        ChDir App.Path & "\YCTBDDJ_JH" '这一句是将路径指向dll所在的目录
        DllHand = LoadLibrary(App.Path & "\YCTBDDJ_JH\PMSMDll.dll")
        If DllHand = 0 Then MsgBox "没法加载DLL,请先将该工程保存重新启动程序!": Exit Sub
        DllProc = GetProcAddress(DllHand, "PMSMAnal")
        If DllProc = 0 Then MsgBox "没找到此函数,请先将该工程保存重新启动程序!": Exit Sub
        CallWindowProc DllProc, DllHand, 0, 0, 0
    '    执行你的DLL的函数
        Call PMSMAnal
        FreeLibrary DllHand '释放DLL
    还是不行:(
      

  5.   

    向上面那样单独调用,是成功的,只是近来又加了模块,用的是另外一个dll,在程序启动时调用那个都是可以的,但是调用完一个再调用另一个就会报错,提示找不到dll。
      

  6.   

    估计:
    DllHand = LoadLibrary(App.Path & "\YCTBDDJ_JH\PMSMDll.dll")
    这一句有问题,你换成绝对路径试试
      

  7.   

    是不是没人能解决rainstormmaster(暴风雨 v2.0) 不要让大家失望,加油啊
      

  8.   

    复制到system32中,或在PATH中加入测试下