簡體   English   中英

從Python向C ++傳遞COM指針數組

[英]passing an array of COM pointers from Python to C++

我已經閱讀了許多文檔,示例和StackOverflow主題,但仍然無法正常工作! 我正在為我的C ++ COM對象編寫一個Python接口。 這不是我第一次這樣做。 過去,我已經成功地使用comtypes獲取單個接口指針,並將它們傳遞給我的COM類,但是這次我需要將一個指針傳遞給接口指針數組。

我需要調用的COM接口:

STDMETHOD(ExportGeopackage)([in] IMap* pMap,
                            [in] imageFormatType imageFormat,
                            [in] long imageQuality,
                            [in] long zoomMin,
                            [in] long zoomMax,
                            [in] IFeatureLayer** attributeExportLayers,
                            [in] BSTR title,
                            [in] BSTR description,
                            [in] BSTR saveToPath,
                            [in] ITrackCancel* pTrackCancel);

attributeExportLayers參數應該是指向IFeatureLayer指針的以N結尾的C數組的指針。 ExportGeopackage()已通過C ++客戶端測試。 我正在編寫第一個Python客戶端。

在Python中:

# append a null pointer to the list of comtypes IFeatureLayer pointers
exportLayers.append(comtypes.cast(0, comtypes.POINTER(esriCarto.IFeatureLayer)))
# create ctypes array and populate
PointerArray = ctypes.c_void_p * len(exportLayers)
pointers = PointerArray()
for i in range(len(exportLayers)):
    pointers[i] = exportLayers[i]

# export is comtypes interface pointer acquired earlier
export.ExportGeopackage(map, format, quality, min, max,
                        ctypes.cast(pointers, ctypes.POINTER(esriCarto.IFeatureLayer)),
                        title, desc, geopackage_path, 0)

比較exportLayer和pointers變量內容的Python轉儲,可以顯示指針值已成功從前者轉移到后者。 這些指針的Python測試成功。 但是,當我調試ExportGeopackage()時,由attributeExportLayers指向的內存與預期的IFeatureLayer指針數組不相似。 它看起來像是單個指針(指向錯誤的位置),后跟一長串的空指針。 考慮到Python指針變量可能已被垃圾回收,我在調用ExportGeopackage()之后添加了對指針的引用。 這沒什么區別。

我是否以某種方式插入了更高級別的間接尋址,或者插入的間接尋址不足? 我很迷惑

TIA尋求任何幫助(或猜測)。 艾倫

再一次回答我自己的問題。 除了所要求的內容外,還引入了另一個間接級別。 顯然,與C中的強制轉換不同,ctypes.cast實際上采用第一個參數的地址。

更改:

PointerArray = ctypes.c_void_p * len(exportLayers)

至:

PointerArray = comtypes.POINTER(esriCarto.IFeatureLayer) * len(exportLayers)

並在對ExportGeopackage()的調用中取消使用ctypes.cast:

export.ExportGeopackage(map, format, quality, min, max,
                        pointers,
                        title, desc, geopackage_path, 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM