如何使用comtypes访问32位VB6 DLL

2024-09-21 01:18:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图访问用VB6编写的旧32位DLL中的两个函数(以前是在Excel 32位环境中访问的)。通过将python 32位与comtypes结合使用,我成功地看到了这两个函数及其输入(作为旁白,我努力通过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_值和CalcARB_TM

我尝试过各种方法,但就我的一生而言,我无法访问这些函数。就我对代码的有限理解而言,clsCalcARB\u Library\u Impl中的CalcARB\u值与clsCalcARB\u 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_值函数。。。但我不确定变量的格式

有谁能帮助我或者至少给我指出正确的方向吗


Tags: 函数infromimportlibraryoutdoublepointer

热门问题