Использование обратного вызова из C -Dll в VB6 - PullRequest
2 голосов
/ 20 апреля 2020

Мне нужно импортировать несколько функций библиотеки DLL, написанной на C, в проект VB6. У меня есть пример, написанный на C#, но я действительно не знаю, как сделать то же самое в VB6.

В C# это выглядит так:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int someCallback(IntPtr ch, uint chL, IntPtr cbData);

[DllImport("someDLL.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int someFunction(IntPtr con, someCallback callback, IntPtr cbData);

Все отлично работает в примере при вызове someFunction.

Документация по dll просто дает мне следующее:

typedef int(SOMEAPI_CALL * someCallback)(const unsigned char *ch,
                                         unsigned int         chL,
                                         void                *cbData)

SOMEAPI_CALL someFunction(Con*         con,
                          someCallback callback,
                          void*        cbData)

Должен быть способ сделать то же самое в VB6, но у меня нет такого большого опыта работы с этим языком. Поискал в Интернете хорошее время, но не нашел ничего, что могло бы мне помочь.

Я знаю, как объявить функции из этой библиотеки в моем проекте, но это так. Как преобразовать эту UnmanagedFunctionPointer штуку в код VB6, я просто не знаю.

1 Ответ

2 голосов
/ 20 апреля 2020

VB6 не имеет атрибутов, как у VB. NET (и C#), и аннотация в любом случае будет ненужной. Вы можете просто передать указатель на функцию API C через оператор AddressOf:

Declare Function someFunction Lib "someDLL" ( _
    ByVal con As Long, _
    ByVal callback As Long, _
    ByVal data As Long _
) As Long

…

Call someFunction(con, AddressOf SomeCallback, data)

Но даже это не будет работать, поскольку VB6 не поддерживает встроенное взаимодействие с использованием соглашения о вызовах cdecl, он поддерживает только stdcall. Вам нужно будет либо перекомпилировать вашу DLL, используя соглашение о вызовах stdcall, либо создать обертку в C или IDL (есть некоторые хаки, использующие встроенную сборку для переноса отдельных вызовов cdecl, но я бы не рекомендовал использовать их).

...