O Visual Studio 6 os typelibs são tratados de maneira diferente no Visual Studio 2008 sob Vista e 7?

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

  •  26-09-2019
  •  | 
  •  

Pergunta

Eu escrevi uma DLL padrão no Visual Studio 6 C ++. Eu também escrevi um typelib para acompanhá -lo para que ele possa ser usado diretamente no VB6 e não via declarar.

Funciona bem no VB6 no Windows XP.

O que não funciona é quando eu tomo a DLL e o TLB para o Vista e o Windows7. Lá o .tlb se registra bem com REGTLIB Mas o único símbolo visível no Visual Studio 2008 é o Attribution constante.

A técnica que estou tentando imitar é encontrada em Como tornar C DLL mais acessível ao VB com uma biblioteca de tipos. É o caso que essa técnica não se aplica mais ???

O código ODL (abreviado) é reproduzido abaixo. Alguma idéia do que está acontecendo?

// 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
Foi útil?

Solução

O problema aqui é que você não apenas mudou o sistema operacional, mas também mudou suas ferramentas de desenvolvimento. Ainda deve funcionar se você executar o VB6 no Win7. Mas o Visual Studio 2008 suporta vb.net, um muito idioma diferente do VB6. Ele suporta apenas bibliotecas de tipos 'verdadeiras', as que o COM usa.

Chamar uma função exportada de uma DLL requer o uso do P/Invoke Marshaller embutido no .NET. Confira o DLLIMPORTATTRIBUTE e a declaração vb.net declaram na biblioteca MSDN. A declaração para essa função deve se parecer com isso:

<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

Não há necessidade de registrar uma biblioteca de tipos com isso. Escrever um invólucro de classe gerenciado no idioma C ++/CLI seria outra abordagem.

Outras dicas

Alguma razão para você criar o TypeLib e não apenas declarar funções no VB6? Colocando

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

No topo do seu módulo, parece muito mais simples.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top