0

Python msilibライブラリを使用して MSI ファイルを読み込んでいます。私の目的は、バイナリ テーブルから [バイナリ データ] を抽出し、ファイルにダンプすることです。(ORCAツールを使用して、[Binary Data]セルをダブルクリックしてバイナリデータを抽出し、ファイルに書き込むことができます)

バイナリ データを取得するための msilib メソッドが見つかりませんでした。Record.GetString(field) を使用して文字列データを取得するメソッドがあります。しかし、予想通り、これは [Binary Data] では機能せず、エラーが発生します。

ここにコードスニペットがあります

import msilib
# msi file path which is to be read
msiFilePath = "C:/msi/test.msi"
dbObj = msilib.OpenDatabase(msiFilePath, msilib.MSIDBOPEN_READONLY)
sqlQuery = "select * from Binary"
view = dbObj.OpenView(sqlQuery)
view.Execute(None)
cur_record = viewObj.Fetch()
# In Binary table; Column no 1 have string data and Column # 2 have [Binary Data]
cur_record.GetString(2)

そして実行時:-

Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
cur_record.GetString(2)
_msi.MSIError: unknown error 70c

それを行う方法はありますか?

4

1 に答える 1

7

msilib完全には機能していません。具体的には、バイナリデータを読み取ることができません。

Pygameは、よりフル機能で拡張可能な(ctypesを使用してPythonで記述されているため)msidbをホストします。pygameのドキュメントではカバーされていないようですが、ソースコードは非常に単純です。

必要なMSIAPIはMsiRecordReadStream、pygame.msidbがラップするget_field_streamものであり、そのCursorクラスで使用されます。

于 2013-02-08T11:32:27.133 に答える