私はたくさんのドキュメント、例、およびStackOverflowトピックを読んできましたが、まだ動作しません!私は自分のC++ COMオブジェクトにPythonインターフェイスを書いています。これは初めてのことではありません。過去に私はcomtypesを使って個々のインターフェイスポインタを取得し、COMクラスに渡しましたが、今度はインターフェイスポインタの配列にポインタを渡す必要があります。私が呼び出す必要がPythonからC++に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ポインタのnullで終わる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とポインタ変数の内容のPythonのダンプを比較すると、正常後者に前者から転送されるポインタ値を示しています。これらのポインタのPythonテストは成功です。しかし、私がExportGeopackage()にデバッグするとき、attributeExportLayersが指すメモリは、期待される配列のIFeatureLayerポインタと似ていません。これは、1つのポインタ(間違った場所を指す)の後に長いポインタのヌルポインタがあるように見えます。おそらくPythonポインタ変数がすでにガベージコレクションされていると考えて、ExportGeopackage()の呼び出しの後にポインタへの参照を追加しました。これは何の違いもありませんでした。
私は何とか間接的に余分なレベルを挿入していますか、間接的に十分ではありませんか?私は神秘的だ。
TIA(ヘルプ)(または推測)。 アラン