在 Python 2.x 时代貌似有支持 COM的。 http://svn.python.org/projects/ctypes/tags/release_0_6_2/ctypes/win32/com/__init__.py 这个 win32 的 COM 包到了 3.x 时代就不见了。从那里参考和借鉴了很多,也被误导了很多,因为从

2.x 到 3.x 变化很大,而且那个包里面也有很多地方写得不够好。

闲话少说,直接贴代码。没加注释,也省略一些复杂 Interface 的定义。

import atexit

import ctypes

import ctypes.wintypes

import traceback

import uuid

HRESULT= ctypes.wintypes.DWORD

LCID= ctypes.wintypes.DWORD

DISPID= ctypes.wintypes.INT

SCODE= ctypes.wintypes.DWORD

VARTYPE= ctypes.c_ushort

S_OK= 0

def __init__():

ctypes.oledll.ole32.CoInitialize(None)

atexit.register(ctypes.oledll.ole32.CoUninitialize)

__init__()

class GUID(ctypes.Structure):

_fields_ = [("Data1", ctypes.wintypes.DWORD),

("Data2", ctypes.wintypes.WORD),

("Data3", ctypes.wintypes.WORD),

("Data4", ctypes.wintypes.BYTE*8)]

def __init__(self, name=None):

iid = uuid.UUID(name)

self.Data1 = iid.time_low

self.Data2 = iid.time_mid

self.Data3 = iid.time_hi_version

data = iid.bytes

for i in range(8):

self.Data4[i] = ctypes.wintypes.BYTE(data[8+i])

def __str__(self):

s = (ctypes.c_wchar*39)()

ctypes.oledll.ole32.StringFromGUID2(ctypes.byref(self), s, 39)

return s.value

REFGUID = REFIID = RIID = ctypes.POINTER(GUID)

class _InterfaceMetaclass(type(ctypes.Structure)):

def __new__(cls, name, bases, kwds):

if "_methods_" in kwds and "_methods_" in bases[0].__dict__:

kwds["_methods_"] = bases[0]._methods_+kwds["_methods_"]

lpVTable = ctypes.POINTER(name+"_VTable")

kwds["_fields_"] = [("lpVtbl", lpVTable)]

newcls = super().__new__(cls, name, bases, kwds)

newcls.lpVTable = lpVTable

if "_methods_" in kwds:

"""make methods"""

newcls._com_methods_ = {}

i = 0

for func, proto in kwds["_methods_"]:

newcls._com_methods_[func] = proto(i, func)

setattr(newcls, func, newcls._InvokeComMethod)

i += 1

return newcls

class IUnknown(ctypes.Structure, metaclass = _InterfaceMetaclass):

def _InvokeComMethod(self, *args):

func = traceback.extract_stack()[-2][-1].split('.')[1].split('(')[0]

return self._com_methods_[func](ctypes.c_void_p(ctypes.addressof(self)), *args)

_iid_ = GUID("{618736E0-3C3D-11CF-810C-00AA00389B71}")

PIUnknown = ctypes.POINTER(IUnknown)

def from_param(self, obj):

if (type(obj) == type(ctypes.byref(ctypes.c_int())) and issubclass(obj._obj._type_, IUnknown)) \

or (isinstance(obj, ctypes._Pointer) and issubclass(obj._type_._type, IUnknown)):

return obj

raise TypeError("expected a reference to IUnknown instead of "+str(type(obj)))

ctypes.POINTER(PIUnknown).from_param = classmethod(from_param)

def STDMETHOD(restype, name, *argtypes, **kw):

return name, ctypes.WINFUNCTYPE(restype, *argtypes)

IUnknown._methods_ = [STDMETHOD(HRESULT, "QueryInterface", REFIID, ctypes.POINTER(PIUnknown)),

STDMETHOD(ctypes.wintypes.ULONG, "AddRef"),

STDMETHOD(ctypes.wintypes.ULONG, "Release")]

IUnknown = _InterfaceMetaclass("IUnknown", (ctypes.Structure,), {"_methods_": IUnknown._methods_, "_iid_": IUnknown._iid_, "_InvokeComMethod": IUnknown._InvokeComMethod})

PIUnknown = ctypes.POINTER(IUnknown)

class ITypeInfo(IUnknown, metaclass = _InterfaceMetaclass):

_iid_ = GUID("{00020401-0000-0000-C000-000000000046}")

class IDispatch(IUnknown, metaclass = _InterfaceMetaclass):

_iid_ = GUID("{00020400-0000-0000-C000-000000000046}")

class BSTR(ctypes.c_wchar_p):

def __del__(self):

ctypes.oledll.oleaut32.SysFreeString(self)

def __repr__(self):

return self.value

"""http://msdn.microsoft.com/en-us/library/windows/desktop/dd373687(v=vs.85).aspx"""

class VARIANT(ctypes.Structure):

class _U(ctypes.Union):

_fields_ = [("lVal", ctypes.wintypes.LONG),# VT_I4

("pdispVal", ctypes.POINTER(IDispatch)),# VT_IDISPATCH

("bstrVal", BSTR)]# VT_BSTR

_anonymous_ = ("_u",)

_fields_ = [("vt", VARTYPE),

("wReserved1", ctypes.wintypes.WORD),

("wReserved2", ctypes.wintypes.WORD),

("wReserved3", ctypes.wintypes.WORD),

("_u", _U)]

class DISPPARAMS(ctypes.Structure):

_fields_ = [("rgvarg", ctypes.POINTER(VARIANT)),

("rgdispidNamedArgs", ctypes.POINTER(DISPID)),

("cArgs", ctypes.wintypes.UINT),

("cNamedArgs", ctypes.wintypes.UINT)]

class EXCEPINFO(ctypes.Structure):

_fields_ = [("wCode", ctypes.wintypes.WORD),

("wReserved", ctypes.wintypes.WORD),

("bstrSource", BSTR),

("bstrDescription", BSTR),

("bstrHelpFile", BSTR),

("dwHelpContext", ctypes.wintypes.DWORD),

("pvReserved", ctypes.c_void_p),

("pfnDeferredFillIn", ctypes.c_void_p), # XXX

("scode", SCODE)]

IDispatch._methods_ = [STDMETHOD(HRESULT, "GetTypeInfoCount", ctypes.wintypes.UINT),

STDMETHOD(HRESULT, "GetTypeInfo", ctypes.wintypes.UINT, LCID, ctypes.POINTER(ctypes.POINTER(ITypeInfo))),

STDMETHOD(HRESULT, "GetIDsOfNames", REFIID, ctypes.wintypes.LPOLESTR, ctypes.wintypes.ULONG, LCID, ctypes.POINTER(DISPID)),

STDMETHOD(HRESULT, "Invoke", DISPID, REFIID, LCID, ctypes.wintypes.WORD, ctypes.POINTER(DISPPARAMS), ctypes.POINTER(VARIANT), ctypes.POINTER(EXCEPINFO), ctypes.wintypes.UINT)]

IDispatch = _InterfaceMetaclass("IDispatch", (IUnknown,), {"_methods_": IDispatch._methods_})

PIDispatch = ctypes.POINTER(IDispatch)

class IAccessible(IDispatch, metaclass = _InterfaceMetaclass):

_iid_ = GUID("{618736E0-3C3D-11CF-810C-00AA00389B71}")

_methods_ = [STDMETHOD(HRESULT, "get_accParent", ctypes.POINTER(PIDispatch)),

STDMETHOD(HRESULT, "get_accChildCount", ctypes.POINTER(ctypes.c_long)),

STDMETHOD(HRESULT, "get_accChild", VARIANT, ctypes.POINTER(PIDispatch)),

STDMETHOD(HRESULT, "get_accName", VARIANT, ctypes.POINTER(BSTR)),

STDMETHOD(HRESULT, "get_accValue", VARIANT, ctypes.POINTER(BSTR)),

STDMETHOD(HRESULT, "get_accDescription", VARIANT, ctypes.POINTER(BSTR)),

STDMETHOD(HRESULT, "get_accRole", VARIANT, ctypes.POINTER(VARIANT)),

STDMETHOD(HRESULT, "get_accState", VARIANT, ctypes.POINTER(VARIANT)),

STDMETHOD(HRESULT, "get_accHelp", VARIANT, ctypes.POINTER(BSTR)),

STDMETHOD(HRESULT, "get_accHelpTopic", ctypes.POINTER(BSTR), VARIANT, ctypes.POINTER(ctypes.c_long)),

STDMETHOD(HRESULT, "get_accKeyboardShortcut", VARIANT, ctypes.POINTER(BSTR)),

STDMETHOD(HRESULT, "get_accFocus", ctypes.POINTER(VARIANT)),

STDMETHOD(HRESULT, "get_accSelection", ctypes.POINTER(VARIANT)),

STDMETHOD(HRESULT, "get_accDefaultAction", VARIANT, ctypes.POINTER(BSTR)),

STDMETHOD(HRESULT, "accSelect", ctypes.c_long, VARIANT),

STDMETHOD(HRESULT, "accLocation", ctypes.POINTER(ctypes.c_long), ctypes.POINTER(ctypes.c_long), ctypes.POINTER(ctypes.c_long), ctypes.POINTER(ctypes.c_long), VARIANT),

STDMETHOD(HRESULT, "accNavigate", ctypes.c_long, VARIANT, ctypes.POINTER(VARIANT)),

STDMETHOD(HRESULT, "accHitTest", ctypes.c_long, ctypes.c_long, ctypes.POINTER(VARIANT)),

STDMETHOD(HRESULT, "accDoDefaultAction", VARIANT),

STDMETHOD(HRESULT, "put_accName", VARIANT, BSTR),# not supported

STDMETHOD(HRESULT, "put_accValue", VARIANT, BSTR)]

PIAccessible = ctypes.POINTER(IAccessible)

class IServiceProvider(IUnknown, metaclass = _InterfaceMetaclass):

_iid_ = GUID("{6D5140C1-7436-11CE-8034-00AA006009FA}")

_methods_ = [STDMETHOD(HRESULT, "QueryService", REFGUID, REFIID, ctypes.POINTER(PIUnknown))]

PIServiceProvider = ctypes.POINTER(IServiceProvider)

python3库查看调用_Python 3 中调用 COM 的库文件 | 学步园相关推荐

  1. java外部类调用内部类_java中的外部类和内部类 | 学步园

    1.概念 外部类:这是一个相对内部类的概念,如果一个类中嵌套了另外一个类,我们就把这个类叫做外部类. 内部类:顾名思义,就是定义在里边的那个类.  见以下代码: 定义了一个类Outer,在Outer内 ...

  2. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...

  3. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )

    文章目录 一.准备 mmap 函数的参数 二.mmap 函数远程调用 一.准备 mmap 函数的参数 上一篇博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 远程调 ...

  4. python调用shell用什么类_python脚本中调用shell命令

    在python脚本中调用类uninx上的系统命令或工具.有下面两种方法 os.system(string cmd | scriptname.sh) 参数可以是shell命令,也可以是shell脚本. ...

  5. python 类函数调用外部函数_python类中调用外部函数,python 函数中 定义类

    Q1:python函数里的数组如何在函数外调用出来 使用返回值的方法有两种: 可以直接把调用的函数作为变量使用 可以用调用函数给一个变量赋值 第一种情况见如下例子: l = [1,2,3,4,5] d ...

  6. SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)...

    存储过程有三种返回: 1.   用return返回数字型数据 2.   用返回参数返回结果,可以返回各种数据类型(通过游标来循环查询结果每一行) 3.   直接在存储过程中用select返回结果集,可 ...

  7. 【Groovy】Groovy 脚本调用 ( Java 类中调用 Groovy 脚本 )

    文章目录 前言 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 a ...

  8. 【Groovy】Groovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 创建 GroovyShell 对象并执行 Groovy 脚本 | 完整代码示例 )

    文章目录 一.Groovy 类中调用 Groovy 脚本 1.创建 GroovyShell 对象并执行 Groovy 脚本 2.代码示例 二.完整代码示例 1.调用者 Groovy 脚本的类 2.被调 ...

  9. 【Groovy】Groovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 参考 Script#evaluate 方法 | 创建 Binding 对象并设置 args 参数 )

    文章目录 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 args ...

最新文章

  1. 过椭圆外一点引两条切线方程_椭圆的一些结论汇总
  2. matplotlib中文乱码
  3. android的线程管理器,[Android开源]:一款安全、轻巧、简单的线程池管理器EasyThread...
  4. 常见数据结构List之LinkedList
  5. ajaxutil java,Ajax的工具类AjaxUtils,使用struts返回Json类型
  6. 通过html备份数据库文件,备份网站文件和数据库
  7. java vo转map_javabean实体类对象转为Map类型对象的方法(转发)
  8. Linq把一个DataTable根据一列去除重复数据
  9. nginx 一般配置实例 静态页面
  10. SitePoint播客#160:坐在树上的Adobe和HTML
  11. 使用Flash绘制曲线动画
  12. 驱动精灵w8ndows xp sp2,独家率先支持Win8 驱动精灵2011 SP2发布
  13. 离散数学:用python实现矩阵乘法与关系矩阵
  14. python中oserror是什么意思,python – OSError:[错误1]不允许操作
  15. 国科大学习资料--人工智能原理与算法-2020年期末考试题解析(学长整理)
  16. ios 扫码枪外设 键盘模式_iPadOS 显威力,苹果 iPad Pro 终于用上带触控板的外接键盘...
  17. 有学历的程序员永远不懂没学历的痛,就像白天不懂夜的黑
  18. 人工智能应用最多的七大领域解析
  19. 加拿大海运专线要多少天?有哪些物流方式?
  20. 统计语言模型,平滑方法,困惑度

热门文章

  1. Why Redis 4.0?
  2. 云云协同解决方案全景图发布 华为云助力科技企业云上创新
  3. 不服来战!青藤发起“雷火引擎”公测赛 百万赏金寻顶尖白帽
  4. 超详细!一文告诉你 SparkStreaming 如何整合 Kafka !附代码可实践
  5. AI赋能红外测温助力精准防控疫情……
  6. 云计算精华问答 | 边缘计算、雾计算、霾计算,它们究竟是什么?
  7. r包调用legend函数_R语言实现基于朴素贝叶斯构造分类模型数据可视化
  8. python乘法函数_Python中列表与元组的乘法操作示例
  9. 服务器响应为4.7.0,454 4.7.0 临时身份验证失败 - Exchange | Microsoft Docs
  10. hashmap value占用空间大小_java-测量和监视大型HashMap的大小