Se Visual Studio 6 typelibs manejan de forma diferente en Visual Studio 2008 bajo Vista y 7?

StackOverflow https://stackoverflow.com/questions/4020592

  •  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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top