在Vista和7下,Visual Studio 2008中的Visual Studio 6类型库是否有不同的处理方式?

时间:2010-10-26 03:56:54

标签: visual-studio-2008 vb6 midl

我在Visual Studio 6 C ++中编写了一个标准DLL。我还写了一个类型库,以便它可以直接在VB6中使用而不是通过Declare。

在Windows XP下,它在VB6中运行良好。

当我将DLL和TLB带入Vista和Windows7时,什么不起作用。 .TLB在REGTLIB处很好地注册,但Visual Studio 2008中唯一可见的符号是Attribution常量。

我试图模仿的技术可以在How To Make C DLL More Accessible to VB with a Type Library找到。这种技术不再适用于这种情况吗?

(缩写)ODL代码如下。知道发生了什么事吗?

// This is the type library for BOBDE.dll
[
    // Use GUIDGEN.EXE to create the UUID that uniquely identifies
    // this library on the user's system. NOTE: This must be done!!
    uuid(EE090BD0-AB6C-454c-A3D7-44CA46B1289F),
    // This helpstring defines how the library will appear in the
    // References dialog of VB.
    helpstring("BOBDE TypeLib"),
    // Assume standard English locale.  
    lcid(0x0409),
    // Assign a version number to keep track of changes.
    version(1.0)
]
library BOBDE
{
    // Now define the module that will "declare" your C functions.
[helpstring("Functions in BOBDE.DLL"), version(1.0),dllname("BOBDE.dll")]   
    module BOBDEFunctions
    {
[helpstring("Blowfish Encode ASCII for ANSI"), entry("BEA_A")] 
    void __stdcall BEA_A( [in] BSTR p1, [in] BSTR p2, [out,retval] BSTR* res );
    // other very similar functions removed for the sake of brevity
const LPSTR Attribution = "This product includes cryptographic software written by Eric Young (eay@cryptsoft.com)"; 
    } // End of Module
}; // End of Library

2 个答案:

答案 0 :(得分:2)

这里的问题是你不仅改变了操作系统,还改变了你的开发工具。如果你在Win7上运行VB6它应该仍然有效。但Visual Studio 2008支持VB.NET,这是一种与VB6不同的非常语言。它只支持'true'类型库,即COM使用的类型库。

从DLL调用导出的函数需要使用.NET内置的P / Invoke编组器。查看MSDN Library中的DllImportAttribute和VB.NET Declare语句。该功能的声明应该类似于:

<DllImport("bobde.dll")> _
Function BEA_A( _
      <MarshalAs(UnmanagedType.BStr)> ByVal p1 As String, _
      <MarshalAs(UnmanagedType.BStr)> ByVal p2 As String) _
    As <MarshalAs(UnmanagedType.BStr)> String
End Function

无需使用此注册类型库。使用C ++ / CLI语言编写托管类包装器将是另一种方法。

答案 1 :(得分:0)

您是否正在创建typelib而不仅仅是在VB6中声明函数?放

Private Declare Function BEA_A Lib "bobde.dll" _
(ByVal p1 As String, ByVal p2 As String) As String 

位于模块顶部似乎更简单。