VBS中需要调用一ActiveX DLL,其工程名为HWin,类名为Win,但发现系统中有2个工程名、类名完全一样类库,一个是我需要的,另一个不是我需要的。用CreateObject("HWin.Win")生成实例时,发现不能正确调用我所需要的类库函数。问:在不删除第二个类库时,有什么办法正确调用我所需要的类库函数?(注意是VBS中调用。)

解决方案 »

  1.   

    使用Regsvr32 /u 卸载掉不需要的那个DLL,只保留有用的那个再试试。
    另外,由于你的工程名和类名都完全相同了,那么可以“HWin.Win”查看一下注册表,看它们是否有区别,比如有时编译器为了区别版本,而自动加上HWin.Win.1之类的字样,这样一来,也可以正确调用。
      

  2.   

    您提供的方法没法在程序里实施,程序里我不知道哪个是必须保留的。编译的时候可以有版本之分,但另一个同样工程名、类名的也可能是别人的软件必须调用的,注销它意味着另个软件无法正常使用了。他们可能的区别就是GUID吧。是否可以根据GUID来分别他们?但我不知道其代码实行办法。
      

  3.   

    如果你知道自己要调用的是哪个DLL,你可以用OLE VIEW查看一下DLL的CLSID和IID,然后使用CoCreateInstance 来代替CreateObject,在CoCreateInstance里指定CLSID和IID。
      

  4.   

    这个CoCreateInstance生成的实例能否直接赋值给Object?类似于CreateObject生成的对象?如果不是,应该怎样生成类似的CreateObect对象。
      

  5.   


    根据CoCreateInstance 关键字查到用法如下:
    Option Explicit   
    Private Type GUID   
        data1 As Long  
        data2 As Integer  
        data3 As Integer  
        data4(7) As Byte  
    End Type   
    Private Const S_OK As Long = &H0   
    Private Declare Function CoCreateInstance Lib "ole32.dll" (clsid As GUID, ByVal pUnkOuter As Long, ByVal dwClsContext As Long, riid As GUID, pvObj As Any) As Long  
    Private Const CLSCTX_INPROC_SERVER As Long = &H1   
    Private Declare Function IIDFromString Lib "ole32.dll" (ByVal lpszIID As Long, iid As GUID) As Long  
    Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszCLSID As Long, clsid As GUID) As Long  
      
    Sub main()   
        Dim shApp As Object  
        Dim clsid As GUID, iid As GUID   
        Const IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"  
        Const CLSID_IShell As String = "{13709620-C279-11CE-A49E-444553540000}"  
      
        '以下三条语句用来创建Shell.Application接口实例,   
        '    相当于VB中Set shApp=CreateObject("Shell.Application")语句   
        If IIDFromString(StrPtr(IID_IDispatch), iid) <> S_OK Then Exit Sub  
        If CLSIDFromString(StrPtr(CLSID_IShell), clsid) <> S_OK Then Exit Sub  
        If CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER, iid, shApp) <> S_OK Then Exit Sub  
           
        '用VB的方式调用接口的一个属性   
        MsgBox shApp.Windows.Count   
           
        '释放接口   
        Set shApp = Nothing  
    End Sub  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyserver/archive/2009/07/14/4345974.aspx