2016-10-19 21 views
0

私はたくさんのドキュメント、例、および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(ヘルプ)(または推測)。 アラン

答えて

0

もう一度自分の質問に答える。必要以上にインダイレクションが追加レベルで導入されています。どうやら、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) 
関連する問題