#python #dll #ctypes #comtypes
Вопрос:
Я пытаюсь получить доступ к двум функциям в старой 32-битной библиотеке DLL, написанной на VB6 (ранее доступ к ней осуществлялся в 32-битной среде Excel). Используя 32-битный python с типами com, мне удалось увидеть две функции и их входные данные (в стороне, я боролся, чтобы найти их с помощью средства просмотра экспорта DLL и dumpbin.exe).
Comtypes возвращает следующую информацию:
# -*- coding: mbcs -*-
typelib_path = 'c:\AF\CalcARB_Library.dll'
_lcid = 0 # change this if required
from ctypes import *
from comtypes import GUID
from comtypes import CoClass
import comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0
from ctypes.wintypes import VARIANT_BOOL
from comtypes.automation import _midlSAFEARRAY
from ctypes import HRESULT
from comtypes import helpstring
from comtypes import COMMETHOD
from comtypes import dispid
class clsCalcARB_Library(CoClass):
_reg_clsid_ = GUID('{2A5721F0-571A-4239-AEEB-B8EED7859C0E}')
_idlflags_ = []
_typelib_path_ = typelib_path
_reg_typelib_ = ('{D1DA3979-1AFE-493E-A6FD-AB5466C226A6}', 1, 0)
class _clsCalcARB_Library(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IDispatch):
_case_insensitive_ = True
_iid_ = GUID('{98414811-7EE4-44A3-8AFF-7B9B6789D7A4}')
_idlflags_ = ['hidden', 'dual', 'nonextensible', 'oleautomation']
clsCalcARB_Library._com_interfaces_ = [_clsCalcARB_Library]
_clsCalcARB_Library._methods_ = [
COMMETHOD([dispid(1745027073), 'propget'], HRESULT, 'CalcARB_Value',
( ['in', 'out'], POINTER(c_double), 'PdblCP' ),
( ['in', 'out'], POINTER(VARIANT_BOOL), 'PboAF' ),
( ['in', 'out'], POINTER(_midlSAFEARRAY(c_double)), 'PdblScale' ),
( ['out', 'retval'], POINTER(c_double), 'None' )),
COMMETHOD([dispid(1745027072), 'propget'], HRESULT, 'CalcARB_TM',
( ['in', 'out'], POINTER(c_double), 'PdblCP' ),
( ['in', 'out'], POINTER(VARIANT_BOOL), 'PboAF' ),
( ['in', 'out'], POINTER(_midlSAFEARRAY(c_double)), 'PdblScale' ),
( ['out', 'retval'], POINTER(c_double), 'None' )),]
################################################################
## code template for _clsCalcARB_Library implementation
class _clsCalcARB_Library_Impl(object):
@property
def CalcARB_Value(self):
'-no docstring-'
#return PdblCP, PboAF, PdblScale, <unnamed>
@property
def CalcARB_MT(self):
'-no docstring-'
#return PdblCP, PboAF, PdblScale, <unnamed>
class Library(object):
name = 'CalcARB_Library'
_reg_typelib_ = ('{D1DA3979-1AFE-493E-A6FD-AB5466C226A6}', 1, 0)
__all__ = [ 'clsCalcARB_Library', '_clsCalcARB_Library']
from comtypes import _check_version; _check_version('1.1.10', 1102672632.000000)
Что меня интересует, так это передача аргументов PdblCP, PboAF и PdblScale в эту функцию и возврат CalcARB_Value и CalcARB_TM.
Я пробовал различные подходы, но ни за что на свете не могу получить доступ к функциям. К моему ограниченному пониманию кода, значение CalcARB_Value в _clsCalcARB_Library_Impl не относится к функциям, определенным в методах в _clsCalcARB_Library.
Другой подход, который я использовал, — это:
import comtypes.client as cc
tlb_id = comtypes.GUID("{D1DA3979-1AFE-493E-A6FD-AB5466C226A6}")
val_model = cc.GetModule((tlb_id, 1, 0))
val_model._clsCalcARB_Library.__clsARB_Library__com__get_ARB_Value(what_goes_here_?)
По-видимому, это, по крайней мере, доступ к функции ARB_Value … но я не уверен в формате переменных.
Кто — нибудь может помочь или хотя бы указать мне правильное направление?