2012-11-18 68 views
3

我正在使用Python通過comtypes模塊的第三方C++庫(通過COM導出typelib)。通過Python使用COM接口初始化OUT參數comtypes庫

其中一個可用的呼叫定義了一個OUT參數,像這樣:

COMMETHOD([helpstring(u'method GetPacket')], HRESULT, 'GetPacket', 
      (['in'], comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.GUID, 'guid'), 
      (['in'], c_int, 'lSize'), 
      (['out'], POINTER(c_ubyte), 'pData')), 

的C++由庫的作者提供的示例代碼初始化pData是長度lSize的字節數組調用GetPacket(),像這樣之前:

pPacket = new BYTE[lSize]; 
HRESULT hr = pData->GetPacket(guid, lSize, pPacket); 

然而,comtypes庫Python沒有提供一種方式來傳遞一個初始值pData - 而且,在調用庫沒有初始值時,INTE rpreter及時segfaults。

是否可以與來自Python的該庫進行互操作 - 理想情況下,從comtypes

回答

1

對生成的GetPacket進行一些低級更改是可能的。

來源:[comtypes-users] Right way to call a method with a pointer to array?

# change GetPacket so the second argument is in, not out 
packet = (c_ubyte * size)() 
data.GetPacket(guid, size, packet) 

但是,請注意,類型庫不包含有關size_islength_isfew other things。這意味着在公寓和流程邊界中使用的泛型類型編組代碼和存根不會查看lSize以確定要從pData中序列化的元素數量,它總是(嘗試)序列化單個指向的項目。

換句話說,那種類型的代碼,無論是C++還是Python,都只能在同一個房間裏工作。

+0

我很努力地在我的python應用程序中使用comtype實現PortableDevice COM API,並陷入了無法將正確的參數傳遞給COM方法的地方。 @acelent,你可以請傳遞你的聯繫方式......我需要像你這樣的專家的有償諮詢。 –

+0

@NilayAnand,我不能那樣做,我很抱歉。每當我有一段時間,我都會看看與Python和COM相關的兩個問題,但對於這種支持,您應該問問comtypes作者或維護者。 – acelent