2017-04-13 1 views
1

を使用してパッチのエラー110を返しI以下JNAのインタフェースを持っている:MsiOpendatabaseはJNA

public interface MsiVersion extends StdCallLibrary { 

    MsiVersion INSTANCE = (MsiVersion)Native.loadLibrary("msi", MsiVersion.class, 
     W32APIOptions.UNICODE_OPTIONS); 

    int MsiOpenDatabase(String szDatabasePath, 
         String szPersist, 
         Memory phDatabase); 
} 

このすべてがうまくているように私は、MSIを開く場合:

int oparationResult = MsiVersion.INSTANCE.MsiOpenDatabase("example.msi", "0", 
    dbPointerMemory); 

私はパッチを開こうとすると私はエラーコード110を取得します。ドキュメントでは、パッチを開こうとしている場合は、何とかMSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILEを "0"ではなく "szPersist"として渡す必要があることがわかりました。

私はこれに基づいて、次を呼び出そうとしました:http://archives.miloush.net/michkap/archive/2006/04/16/577108.html

int oparationResult = MsiVersion.INSTANCE.MsiOpenDatabase("example.msp", "32", 
    dbPointerMemory); 

しかし、まだエラーコード110を取得し、誰かが正しいパラメータを見つけるために私を助けることはできますか?

おかげで、 バリント

+0

MSI/MSMデータベースファイル用に設計されたAPIを使用してパッチを開くことはできません。パッチはCABが埋め込まれたトランスフォームによく似ています。あなたは何をしようとしているのですか? – PhilDW

+0

@PhilDW MSI/MSMデータベースファイル用に設計されたAPIを使用してパッチを開くことはできません - 実際は[APIドキュメント](https://msdn.microsoft.com/en-us/library/windows/desktop/aa370338) (v = vs.85).aspx)では、パッチを開くことができます。これが意味をなさないかどうかは、OPの質問ではありません。 – zett42

+0

こんにちは、私はmsi /パッチに関連するバージョン番号を取得しようとしています。 "msi"の場合はうまく動作します。 –

答えて

0

おそらく、ここで説明するのANSI/Unicodeの問題に実行している:

https://blogs.msdn.microsoft.com/heaths/2006/03/31/opening-patch-files-when-compiled-for-unicode/

しかし、あなたはあなたがしているかどうかを言う必要があるだろうことを確認しますUnicodeモードかどうか、MSIDBOPEN_PATCHFILEの実際の値

+0

こんにちは、私は "W32APIOptions.UNICODE_OPTIONS"でライブラリを開くので、私はユニコードモードで作業していると思います。 –

0

MsiOpenDatabaseszPersistパラメータの文字列ポインタを期待していますが、パーシスタンスモードが指定されている場合、実際には文字列ポインタにキャストされた数字はです。

#define MSIDBOPEN_READONLY (LPCTSTR)0 
#define MSIDBOPEN_PATCHFILE 32/sizeof(*MSIDBOPEN_READONLY) 

あなたはszPersistパラメータに文字列リテラル「32」を渡しているが、代わりにあなたがそれをの価値を持っているポインタに合格する必要があります:「msiquery.h」から

32:

Pointer openMode = Pointer.createConstant(32); 
int operationResult = MsiVersion.INSTANCE.MsiOpenDatabase("example.msp", openMode, dbPointerMemory); 

私はJavaプログラマではないので、私はちょうどreferenceを読んでからこれを作ってきましたし、このFAQ任意のポインタ値を取得するにはどうすればよいですか?)。

私はあなたにもJNAインターフェイスを変更する必要がある場合はわからない:

int MsiOpenDatabase(String szDatabasePath, 
        Pointer szPersist, 
        Memory phDatabase); 

注:Heath Stewart explainedとして、ヘッダファイル「msiquery.h」の定義が間違っています。 Unicode用にコンパイルしていても、MSIDBOPEN_PATCHFILEの値は常に32でなければなりません。

+0

チップをありがとう。私はそれを試しましたが、残念ながら、それは動作していません。私は同じエラー(エラーコード110)を取得します。 –

+0

@balint 2番目のパラメータに 'Pointer'を使うようにインターフェースを変更しましたか? – zett42

+0

@balint [この回答](http://stackoverflow.com/a/5314469/7571258)のように、Unicode版のAPI(W接尾辞で示される)を直接使用することもできます。 – zett42