python3库查看调用_Python 3 中调用 COM 的库文件 | 学步园
在 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 的库文件 | 学步园相关推荐
- java外部类调用内部类_java中的外部类和内部类 | 学步园
1.概念 外部类:这是一个相对内部类的概念,如果一个类中嵌套了另外一个类,我们就把这个类叫做外部类. 内部类:顾名思义,就是定义在里边的那个类. 见以下代码: 定义了一个类Outer,在Outer内 ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )
文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )
文章目录 一.准备 mmap 函数的参数 二.mmap 函数远程调用 一.准备 mmap 函数的参数 上一篇博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 远程调 ...
- python调用shell用什么类_python脚本中调用shell命令
在python脚本中调用类uninx上的系统命令或工具.有下面两种方法 os.system(string cmd | scriptname.sh) 参数可以是shell命令,也可以是shell脚本. ...
- python 类函数调用外部函数_python类中调用外部函数,python 函数中 定义类
Q1:python函数里的数组如何在函数外调用出来 使用返回值的方法有两种: 可以直接把调用的函数作为变量使用 可以用调用函数给一个变量赋值 第一种情况见如下例子: l = [1,2,3,4,5] d ...
- SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)...
存储过程有三种返回: 1. 用return返回数字型数据 2. 用返回参数返回结果,可以返回各种数据类型(通过游标来循环查询结果每一行) 3. 直接在存储过程中用select返回结果集,可 ...
- 【Groovy】Groovy 脚本调用 ( Java 类中调用 Groovy 脚本 )
文章目录 前言 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 a ...
- 【Groovy】Groovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 创建 GroovyShell 对象并执行 Groovy 脚本 | 完整代码示例 )
文章目录 一.Groovy 类中调用 Groovy 脚本 1.创建 GroovyShell 对象并执行 Groovy 脚本 2.代码示例 二.完整代码示例 1.调用者 Groovy 脚本的类 2.被调 ...
- 【Groovy】Groovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 参考 Script#evaluate 方法 | 创建 Binding 对象并设置 args 参数 )
文章目录 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 args ...
最新文章
- 过椭圆外一点引两条切线方程_椭圆的一些结论汇总
- matplotlib中文乱码
- android的线程管理器,[Android开源]:一款安全、轻巧、简单的线程池管理器EasyThread...
- 常见数据结构List之LinkedList
- ajaxutil java,Ajax的工具类AjaxUtils,使用struts返回Json类型
- 通过html备份数据库文件,备份网站文件和数据库
- java vo转map_javabean实体类对象转为Map类型对象的方法(转发)
- Linq把一个DataTable根据一列去除重复数据
- nginx 一般配置实例 静态页面
- SitePoint播客#160:坐在树上的Adobe和HTML
- 使用Flash绘制曲线动画
- 驱动精灵w8ndows xp sp2,独家率先支持Win8 驱动精灵2011 SP2发布
- 离散数学:用python实现矩阵乘法与关系矩阵
- python中oserror是什么意思,python – OSError:[错误1]不允许操作
- 国科大学习资料--人工智能原理与算法-2020年期末考试题解析(学长整理)
- ios 扫码枪外设 键盘模式_iPadOS 显威力,苹果 iPad Pro 终于用上带触控板的外接键盘...
- 有学历的程序员永远不懂没学历的痛,就像白天不懂夜的黑
- 人工智能应用最多的七大领域解析
- 加拿大海运专线要多少天?有哪些物流方式?
- 统计语言模型,平滑方法,困惑度
热门文章
- Why Redis 4.0?
- 云云协同解决方案全景图发布 华为云助力科技企业云上创新
- 不服来战!青藤发起“雷火引擎”公测赛 百万赏金寻顶尖白帽
- 超详细!一文告诉你 SparkStreaming 如何整合 Kafka !附代码可实践
- AI赋能红外测温助力精准防控疫情……
- 云计算精华问答 | 边缘计算、雾计算、霾计算,它们究竟是什么?
- r包调用legend函数_R语言实现基于朴素贝叶斯构造分类模型数据可视化
- python乘法函数_Python中列表与元组的乘法操作示例
- 服务器响应为4.7.0,454 4.7.0 临时身份验证失败 - Exchange | Microsoft Docs
- hashmap value占用空间大小_java-测量和监视大型HashMap的大小