各位,本人有一事不明,请赐教:
在VB中,调用DLL中的函数时,要用declare function xxxx lib "xxxx.dll" as datatype 的样式声明,
其中lib后面的动态连接库位置是否只能是一个字符串常量,如果我想在程序运行时,动态指定DLL的位置,怎么做,谢谢!

解决方案 »

  1.   

    呵呵 没有试过在运行时能不能直接把DLL文件替换了,
    如:程序调用A.dll你用B.dll去覆盖它就变成调用B.dll了
      

  2.   

    如果是纯粹的DLL,crycoming的方法就行。
    尝试使用MSScriptControl.ScriptControl,可不能添加声明的代码,失败!
      

  3.   

    一个通过LoadLibrary来动态装载DLL的代码:
    http://www.codetoad.com/visual_basic/graphics/custom_cursor.asp
      

  4.   

    试着使用条件编译:
    #If Dir("searchmail.dll") = "" Then
        Private Declare Function pickup Lib "searchmail.dll" (ByVal URL As String) As String
    #Else
        Private Declare Function pickup Lib "searchmail.dll" (ByVal URL As String) As String
    #End If
    提示说“变量未定义”,出错地方在Dir函数。
      

  5.   

    可以借助vc来解决,用vc写个dll,其中的作用就是动态调用相应的dll,
    而vb就调用这个由vc写的函数,除了传递原dll函数中的参数外再加上原dll的路径
      

  6.   

    条件编译是要用常数的一般动态调用可以用CallWindowProc之类的API或者修改代理对象VTable来实现,有现成的例子
      

  7.   

    我以前写的,你可以参考修改一下http://ms.mblogger.cn/supergreenbean/posts/5533.aspx
      

  8.   

    哈哈,受了lingll的启发,用VB的土办法来实现!^_^
    原程序代码:
    Private Declare Function pickup Lib "searchmail.dll" (ByVal URL As String) As StringPrivate Sub Command1_Click()
        MsgBox pickup("http://www.people.com.cn/GB/other6232/6239/")
    End Sub
    根据楼主的要求作的更改:
    Private Declare Function pickup1 Lib "searchmail.dll" Alias "pickup" (ByVal URL As String) As String
    Private Declare Function pickup2 Lib "searchmail2.dll" Alias "pickup" (ByVal URL As String) As StringPrivate Sub Command1_Click()
        MsgBox pickup("http://www.people.com.cn/GB/other6232/6239/")
    End Sub
    Private Function pickup(ByVal URL As String) As String
        On Error GoTo e
        pickup = pickup1(URL)
        Exit Function
    e:
        pickup = pickup2(URL)
    End Function
      

  9.   

    searchmail.dll函数及示例下载:
    http://www.powerbasic.cn/products/SearchMail_dll.rar
      

  10.   

    谢谢大家答复,但我还是没搞明白,我是想实现这样一个目的:
    我有一个自己的DLL,在VBA中调用它,那么随着Excel文档位置的变化(比如拷到领一台计算机上)
    ,只要将该DLL与Excel文档拷到同一路径下即可,那么LIB后面怎么实现,只能是一个字符串常量?
      

  11.   

    一般你只要写该dll的文件名就可以,不需要加路径。而dll文件的话,你如果能复制到windows系统目录system或system32里去,那就会比较方便了
      

  12.   

    把DLL文件拷贝到WINDOWS下的SYSTEM(XP是SYSTEM32)目录不行吗?
      

  13.   

    哈哈,原来如此!Private Declare Function pickup Lib "searchmail.dll" (ByVal URL As String) As StringPrivate Sub CommandButton1_Click()
        On Error GoTo Request_Copy
        MsgBox pickup("http://www.people.com.cn/GB/other6232/6239/")
        Exit Sub
    Request_Copy:
        Dim Source As String, Destination As String
        Source = Application.ActiveWorkbook.Path
        Source = Replace(Source & "\" & "searchmail.dll", "\\", "\")
        Destination = Application.Path
        Destination = Replace(Destination & "\" & "searchmail.dll", "\\", "\")
        FileCopy Source, Destination
        Resume
    End Sub