Python:将COM PyIUnknown转换为已知数据类型

时间:2014-10-08 07:34:54

标签: python vb.net com

我目前正在尝试让python应用程序与VB应用程序做同样的事情。

该应用程序通过COM API从外部设备检索图像。我使用了win32com并设法使用Dispatch机制与COM API进行通信。

在VB应用程序中,图像存储如下

pictureData = objResult.Properties('ResultImage')
myImage = AxHost.GetPictureFromIPicture(pictureData)

在我的Python应用程序中,但是在图片数据成员上,我得到了PyIUnknown对象类型。如何从这个“未知”对象中获取图像数据?

让我添加其他'基本'数据,比如字符串,我可以在Python应用程序上看到它们。

1 个答案:

答案 0 :(得分:0)

我找到了一种有效的方法,也许并不完美,但如果有人谷歌这个问题,我希望它有所帮助。

from win32com.client import Dispatch
import pythoncom

imagedata = data.Properties.Item('ResultImage') #this is samas the VB line in the question , except I have to add 'Item' here 

#win32com does not define IPicture type (http://timgolden.me.uk/pywin32-docs/com_objects.html)
ipicture = Dispatch(imagedata.QueryInterface(pythoncom.IID_IDispatch))

import win32ui
import win32gui

#creates a PyCBitMap object
imagebitmap = win32ui.CreateBitmapFromHandle(ipicture.Handle)

#we need a DC handle to save the bitmap file for some reason...
dc_handler = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
#this overwrites any older file without asking
imagebitmap.SaveBitmapFile(dc_handler,'last_pic.bmp')

我脑子里仍然存在的问题是:

  1. 我们是否只能以动态的方式与IPicture或任何未定义的COM(通过win32com)进行交互?是否有一种优雅的方式来扩展接口的定义等? 我尝试使用QueryInterface(pythontypes.IID('{7BF80980-BF32-101A-8BBB-00AA00300CAB}')。我从http://msdn.microsoft.com/en-us/library/windows/desktop/ms680761(v=vs.85).aspx得到了这个IID但是我在Python中遇到了一个错误,这个界面无法处理。

  2. 不确定为什么我不能使用为IPicture定义的方法,但我可以访问属性? 我只是尝试使用ipicture.get_Handle()或ipicture.SaveAsFile(),但这些都不起作用。

相关问题