Самый простой способ экспортировать функцию из библиотеки VB6 - это использовать надстройку vbAdvance , и теперь она бесплатна.
Проблема, с которой вы столкнулись, заключается в том, что вам нужно инициализировать среду выполнения VB6.в теме, которая вызывает ваш экспорт.Это также включает инициализацию COM-квартиры (STA).Проще всего было бы создать экземпляр класса VB6 из кода Python.
Инициализация времени выполнения VB6 "вручную" в вашей функции экспорта намного сложнее, и для вызова API-функций потребуется использовать пользовательскую библиотеку типов.(не может использовать объявления или встроенные функции VB6 до инициализации времени выполнения).
Вот функция, которую я использую
Private Function pvInitVbRuntime() As Boolean
' Const FUNC_NAME As String = "pvInitVbRuntime" '
Const PROGID_DUMMY As String = LIB_NAME & ".cDummy"
Dim lIdx As Long
lIdx = GetModuleHandle("MSVBVM60.DLL")
lIdx = GetProcAddress(lIdx, "__vbaSetSystemError")
Call RtlMoveMemory(lIdx, ByVal lIdx + 9, 4)
Call RtlMoveMemory(lIdx, ByVal lIdx, 4)
If TlsGetValue(lIdx) <> 0 Then
Call CoCreateInstance(CLSIDFromProgID(PROGID_DUMMY), Nothing, CLSCTX_INPROC_SERVER, VBGUIDFromString("{00000000-0000-0000-C000-000000000046}"), Nothing)
pvInitVbRuntime = True
Else
' Call APIOutputDebugString(GetCurrentThreadId() & ": not a VB thread [" & LIB_NAME & "." & MODULE_NAME & "." & FUNC_NAME & "]" & vbCrLf) '
End If
End Function
Все функции API (GetModuleHandle
,GetProcAddress
, RtlMoveMemory
, TlsGetValue
, CoCreateInstance
, CLSIDFromProgID
, VBGUIDFromString
, APIOutputDebugString
) объявлены в пользовательской библиотеке типов.По сути, он создает фиктивный класс VB6 (называемый cDummy
) в потоке.Функция не выполняется, если квартира еще не инициализирована (CoInitialize
не вызывается).