Se Visual Studio 6 typelibs manejan de forma diferente en Visual Studio 2008 bajo Vista y 7?
-
26-09-2019 - |
Pregunta
He escrito un DLL estándar en Visual Studio 6 C ++. También he escrito una biblioteca de tipos para ir con ella para que pueda ser utilizado directamente en lugar de a través de VB6 Declare.
Funciona bien en VB6 en Windows XP.
Lo que no funciona es cuando tomo la DLL y el TLB en Vista y Windows 7. Hay registros de la fina .tlb con REGTLIB
pero el único símbolo que es visible en Visual Studio 2008 es la constante Attribution
.
La técnica Estoy intentando emular se encuentra en Cómo hacer C DLL más accesible para VB con una Tipo Biblioteca. Es cierto que esta técnica ya no se aplica ???
El (abreviado) código ODL se reproduce a continuación. Cualquier idea de lo que está pasando?
// 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
Solución
El problema aquí es que no se acaba de cambiar el sistema operativo, también cambiaron sus herramientas de desarrollo. Todavía debe trabajar si ejecuta Visual Basic 6 en Win7. Sin embargo, Visual Studio 2008 es compatible VB.NET, un muy idioma diferente en VB6. Sólo 'verdaderos' bibliotecas de tipos de soportes, los que usos COM.
Llamar a una función exportada de una DLL requiere el uso de la marshaller P / Invoke incorporado en .NET. Salida DllImportAttribute y la instrucción Declare VB.NET en la biblioteca de MSDN. La declaración de esa función debería parecerse a esto:
<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
No es necesario registrar una biblioteca de tipos con esto. Escribir un envoltorio clase administrada en el C ++ / CLI lenguaje sería otro enfoque.
Otros consejos
algún motivo que está creando biblioteca de tipos y no sólo declarar funciones en VB6? Poniendo
Private Declare Function BEA_A Lib "bobde.dll" _
(ByVal p1 As String, ByVal p2 As String) As String
en la parte superior de su módulo parece mucho más simple.