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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab的try函数,matlab – 是否可以在没有try块的情况下测试函数句柄?

要测试函数句柄,例如在你的问题中筛选出伪造的x notreallyafunction,你可以使用functions命令检查句柄并获取引用函数的名称,类型(简单,嵌套,重载,匿名等),和位置,如果它在文件中定义.>> x notreallyafunction;>> functions(x)ans function: notreallyafunction…

图片马赛克去除工具_图片太多该如何进行排版呢?

胖友们大家好呀,我是三儿昨天三儿刚讲了多文字如何排版就有胖友在后台留言说问三儿如何对图片较多的内容排版那么今天三儿就来教大家图片较多时我们该怎样排版!赶紧拿着小本本做好笔记哦!图片的重要性图片在排版设计中,占有很大的…

神经网络人口预测matlab,BP神经网络预测(人口)程序(matlab)

自己测试人口预测的matlab实现:x[5416755196563005748258796602666146562828646536599467207662076585967295691727049972538745427636878534806718299285229871778921190859924209371794974962599754298705100072101654103008104357105851107507109300111026112704…

idhttp返回乱码_HTTP客户端POST方式中文编码(乱码)解决方案(转)

这段时间,在给一个地区门户网站(alexa全球排行1200左右)做SSO集成,其中的一个部分就是Web Services服务接口,以及客户端,我们采用的是REST方式,不是SOAP,大致就是客户端通过HTTP POST方式向服务器提交数据&…

php如何监听页面滚动,html5中在元素滚动条在滚动时触发的事件onscroll

实例元素滚动时执行 JavaScript定义和用法onscroll 事件在元素滚动条在滚动时触发。提示: 使用 CSS overflow 样式属性来创建元素的滚动条。浏览器支持语法HTML 中:JavaScript 中:object.οnscrοllfunction(){myScript};JavaScript 中, 使用 addEventListener() 方…

stream去重_重复数据如何处理?List集合去重的四种方式

List集合在Java日常开发中是必不可少的,只要懂得运用各种各样的方法就可以大大提高我们开发的效率,适当活用各种方法才会使我们开发事半功倍。但是,有时候难免会遇到集合里的数据是重复的,需要进行去除。今天,就给大家…

php强制转成字符串,php怎么强制转成字符串

php强制转成字符串的方法:首先创建一个PHP示例文件;然后定义一个变量;最后通过PHP中的string方法强制转换成字符串即可。本文操作环境:windows7系统、PHP7.1版,DELL G3电脑PHP强制转换类型获取数据类型 :1.如果想查看某…

虚幻4模型提取_【UnrealEngine4】从虚幻四的着色模型到NPR

本文主要分享虚幻四中着色器的使用技巧与如何添加自己的着色模型的方式。(正在设计的一个像素风格的渲染流程,同样采用本文的方法,对引擎的着色模型进行了改造,可以接受天光/点光等的自定义照明效果)鄙人消失了一个月左右,又回来了…

可观测性PHP秩判据,线性系统的可控性与可观测性

现代控制理论中用状态方程和输出方程描述系统,输入和输出构成系统的外部变量,而状态为系统的内部变量,这就存在着系统内的所有状态是否可受输入影响和是否可由输出反映的问题,这就是可控性和可观测性问题。如果系统所有状态变量的…

ubuntu虚拟机进程被杀死_Ubuntu -- 查看和杀死进程

今天在netbeans中关闭webrick时,发现没有关闭掉,打入localhost:3000 依然显示页面,发现无法从nb中再次关闭只有进入ubuntu的进程下关闭查看进程:1, ps -e2, fengfeng:~$ sudo netstat -antupActive Internet connections (servers and established)Proto Recv-Q Send-Q Local…

matlab中的nlinfit,matlab中nlinfit问题!!!!!!!!!!!!

matlab中nlinfit问题!!!!!!!!!!!!mip版 关注:272 答案:3 悬赏:40解决时间 2021-01-19 04:20已解决2021-01-18 13:28muinline(beta(…

springboot幂等性_请问,springboot项目支付接口设计,如何保证支付的幂等性,并能给前端反馈友好的提示?...

什么是幂等性?幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。“ 在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函…

php图片旋转显示不出来的,php – 我服务的图像不正确,它们都显示为旋转90度

在Exif中设置了方向.图片没有旋转phisicaly.图像查看器可以使用它,但标签中的浏览器不会旋转它.你也可以“飞行”旋转它.只需通过exif_read_data()获取Exif信息,如果在’Orientation’中有3(180deg),6(90CW)或8(-90CCW),则旋转它// dump the picture and stop the script$sourc…

bootstrap 滚动 进度条_bootstrap实现动态进度条效果

Bootstrap的动态进度条:html: 创建一个modal 这里使用fade先将modal隐藏起来,然后modal里面嵌入progress 代码很简单保存中:{{length}}%PS:关于模态框:如果你想实现点击空白处不关闭模态框,可以在这里初始化modal的参数&#xf…

电机控制系统php,电机控制系统的未来发展变化趋势

在智能化生产系统的发展过程之中,网络化分布式生产设备的实现意味着我国机器设备之间可以达到信息沟通的能力,而在这种沟通之中良好的控制系统则承担了枢纽的职责。在这种地机控制系统的发展之中迎合了我国智能联网时代的发展需求,将人机交互…

天宫初级认证答案_百度初级认证试题答案

仅供参考1. 推广商户想了解关键词在一地的推广情况,可使用:(单选题)估算工具 批量工具 推广实况工具 账户分析工具2. 在推广计划级别,可以进行以下哪些操作:(多选题)添加关键词 设置否定关键词 设置IP 排除 设置每日预算3. 关于账…

ci php做记录删除,CI(CodeIgniter)框架中的增删改查操作_PHP教程

CodeIgniter的数据函数类在 \system\database\DB_active_rec.php代码如下:class ModelName extends CI_Model{function __construct(){parent::__construct();}}连接数据库:$this->load->database();代码如下:classModel_name extends CI_Model{function __co…

python list 底层实现的数据结构_Python数据结构大起底——list篇

python内置的多种数据结构为编程提供了相当的便利,灵活的使用python中的内置数据类型可以达到事半功倍的效果,本文是对Python一些常用数据类型的整理,并列举出来了一些使用技巧。使用最多的数据结构 listlist内置了许多方法,常用的…

微信wechat.class.php,laravel使用组件实现微信网页授权登入

laravel框架中的实现简单实现微信网页授权登入首先引入基于laravel的easywechat的组件,laravel版本5.8$ cd laravel$ composer require "overtrue/laravel-wechat:~5.0"然后呢因为下载过程会比较缓慢所以可以先根据官方提供的方式配置一下该组件的中间件根据官方提供…

linux 扩展挂载盘大小_Linux 添加挂载硬盘(包含挂载大于2T以上硬盘)

转自:http://blog.csdn.net/season_hangzhou/article/details/36423223由于事先规划问题或者业务需求量激增,总会出现机器硬盘空间不够用的情况所以常常需要新增硬盘,操作方法如下一、安装硬盘到物理机上。二、查看硬盘是否正确安装。使用“f…