Visual studio 2008 Visual Studio 6 TypeLib在Visual Studio 2008中在Vista和7下的处理方式是否不同? 我在Visual Studio 6 C++中编写了一个标准的DLL。我还编写了一个与之配套的typelib,以便它可以直接在VB6中使用,而不是通过Declare

Visual studio 2008 Visual Studio 6 TypeLib在Visual Studio 2008中在Vista和7下的处理方式是否不同? 我在Visual Studio 6 C++中编写了一个标准的DLL。我还编写了一个与之配套的typelib,以便它可以直接在VB6中使用,而不是通过Declare,visual-studio-2008,vb6,midl,Visual Studio 2008,Vb6,Midl,它在WindowsXP下的VB6中运行良好 不起作用的是当我把DLL和TLB带进Vista和Windows7时。在这里,.TLB可以很好地注册为REGTLIB,但在VisualStudio2008中唯一可见的符号是属性常量 我尝试模仿的技术可以在中找到。这种技术是否不再适用 (缩写)ODL代码复制如下。知道发生了什么吗 // This is the type library for BOBDE.dll [ // Use GUIDGEN.EXE to create the UUID tha

它在WindowsXP下的VB6中运行良好

不起作用的是当我把DLL和TLB带进Vista和Windows7时。在这里,.TLB可以很好地注册为
REGTLIB
,但在VisualStudio2008中唯一可见的符号是
属性
常量

我尝试模仿的技术可以在中找到。这种技术是否不再适用

(缩写)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

这里的问题是,您不仅更改了操作系统,还更改了开发工具。如果在Win7上运行VB6,它仍然可以工作。但是VisualStudio2008支持VB.NET,这是一种与VB6截然不同的语言。它只支持COM使用的“true”类型库

从DLL调用导出的函数需要使用.NET中内置的p/Invoke封送器。查看MSDN库中的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
_
函数BEA_A(_
ByVal p1作为字符串_
ByVal p2(作为字符串)_
作为字符串
端函数

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

您创建typelib而不仅仅是在VB6中声明函数的原因是什么?放置

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

在模块的顶部似乎要简单得多。

“如果在Win7上运行VB6,它仍然可以工作”可能是我的问题所在。一个同事有Win7。我有Server2008和一些带有XP和Ubuntu的VirtualBox虚拟机。我真的不清楚你们在使用什么工具。我发布的声明只在VB.NET中有效,在VB6中无效。顺便说一句,Server2008和Win7支持VB6运行时。如果您使用的是VB.Net,则需要Hans发布的P/Invoke头。您可以使用微软CLR互操作TeaSimple答案:智能感知来从C++标题自动创建此P/Unjk代码。添加了答案:通过Declare将字符串转换为ANSI。我想通过BSTR考试。typelib方法使这成为可能。这是一个小麻烦,但是如果你想要wchar*你可以使用varptr()字符串。对我来说,任何我可以避免注册和混乱的注册表和卸载程序更好。。。嗯,至少以我的经验来看。