В Visual Studio 2008 под Vista и 7 по-разному обрабатываются библиотеки типов Visual Studio 6? - PullRequest
0 голосов
/ 26 октября 2010

Я написал стандартную DLL в Visual Studio 6 C ++.Я также написал typelib, чтобы он мог использоваться непосредственно в VB6, а не через Declare.

Отлично работает в VB6 под Windows XP.

Что не работает, так это когда я беру DLL и TLB в Vista и Windows7.Там .TLB отлично регистрируется с REGTLIB, но единственным символом, который виден в Visual Studio 2008, является константа Attribution.

Техника, которую я пытаюсь эмулировать, находится на Как сделать C DLL более доступной для VB с библиотекой типов .Это тот случай, когда этот метод больше не применяется ???

(сокращенный) код 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

Ответы [ 2 ]

2 голосов
/ 26 октября 2010

Проблема в том, что вы не просто изменили операционную систему, но и изменили инструменты разработки. Это все еще должно работать, если вы запускаете VB6 на Win7. Но Visual Studio 2008 поддерживает VB.NET, очень язык, отличный от VB6. Он поддерживает только «истинные» библиотеки типов, которые использует COM.

Для вызова экспортированной функции из DLL требуется использовать маршаллер P / Invoke, встроенный в .NET. Проверьте DllImportAttribute и оператор VB.NET Declare в библиотеке MSDN. Объявление для этой функции должно выглядеть примерно так:

<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

Нет необходимости регистрировать библиотеку типов с этим. Написание обёртки управляемого класса на языке C ++ / CLI было бы другим подходом.

0 голосов
/ 26 октября 2010

По какой причине вы создаете typelib, а не просто объявляете функции в VB6? Ввод

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

вверху вашего модуля кажется намного проще.

...