2017-04-13 51 views
1

補丁,我有以下JNA接口:MsiOpendatabase返回錯誤110使用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作爲「szPersist」而不是「0」傳遞給我,如果我想打開補丁。

我試着撥打在此基礎上以下內容: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

問題是,MsiOpenDatabase需要szPersist參數的字符串指針,但是如果是如果指定了持久性模式,則實際上這是一個數字,轉換爲字符串指針

從「msiquery.h」:

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

您傳遞字符串字面「32」到szPersist參數,而是你需要傳遞一個指針具有的價值32:

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

我不是一個Java程序員,所以我只是做這件事從閱讀referenceFAQ如何獲取任意指針值?)。

我不知道你是否也必須改變JNA接口:

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

注:作爲Heath Stewart explained,在頭文件「msiquery.h」的定義不正確。即使編譯爲Unicode,MSIDBOPEN_PATCHFILE的值也必須始終爲32

+0

感謝您的提示。我試了一下,但不幸的是,它不工作。我得到相同的錯誤(錯誤代碼110)。 –

+0

@balint你是否改變了使用'Pointer'作爲第二個參數的接口? – zett42

+0

@balint你也可以嘗試直接使用Unicode的Unicode版本(用'W'後綴表示),如[本答案](http://stackoverflow.com/a/5314469/7571258)中所示。這個接口是'int MsiOpenDatabaseW(WString szDatabasePath,Pointer szPersist,Memory phDatabase);' – zett42