Visual Studio 6 sont typelibs gérées différemment dans Visual Studio 2008 sous Vista et 7?

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

  •  26-09-2019
  •  | 
  •  

Question

J'ai écrit une DLL standard dans Visual Studio 6 C ++. J'ai aussi écrit un typelib pour aller avec elle pour qu'il puisse être utilisé directement dans VB6 plutôt que par Declare.

Il fonctionne très bien dans VB6 sous Windows XP.

Qu'est-ce qui ne fonctionne pas est quand je prends la DLL et le TLB dans Vista et Windows7. Là, les registres .TLB bien avec REGTLIB mais le seul symbole qui est visible dans Visual Studio 2008 est la constante de Attribution.

La technique que je vais essayer de Emuler se trouve à Comment faire DLL C plus accessible à VB avec un Tapez Bibliothèque. Est-ce le cas que cette technique ne s'applique plus ???

(abrégé) code ODL est reproduit ci-dessous. Toute idée de ce qui se passe?

// 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
Était-ce utile?

La solution

Le problème ici est que vous non seulement changé le système d'exploitation, vous avez aussi changé les outils de développement. Il doit encore travailler si vous exécutez VB6 sur Win7. Mais Visual Studio 2008 prend en charge VB.NET, très langue différente de VB6. Il ne supporte que « vrais » bibliothèques de types, celles que les utilisations COM.

Appel d'une fonction exportée à partir d'une DLL nécessite l'utilisation de la P / Invoke placier intégré dans .NET. Consultez DllImportAttribute et l'instruction Declare VB.NET dans la bibliothèque MSDN. La déclaration de cette fonction devrait ressembler à ceci:

<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

Pas besoin d'enregistrer une bibliothèque de type avec cela. L'écriture d'un wrapper de classe gérée dans le C ++ / CLI langue serait une autre approche.

Autres conseils

Quel est le motif que vous créez typelib et non pas seulement déclarer des fonctions dans VB6? Mettre

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

en haut de votre module semble beaucoup plus simple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top