2011-05-10 19 views
1

我試圖發現在Windows 7上的Java與JNA AppData\LocalLow工作的位置,但可用於工作最接近的功能是:檢測應用程序數據 LocalLow的位置與JNA

W32API.HRESULT SHGetFolderPath(W32API.HWND hwndOwner,int nFolder,W32API.HANDLE 
           hToken,W32API.DWORD dwFlags,char[] pszPath) 

在這裏,我們已在Solution in C#

但在我的情況下,JAVA + JNA,我想知道我怎麼可以使用LocalLow GUID只有SHGetFolderPath,也許我應該看看這個問題從不同的角度(JNI也許會更好嗎? )

如果有人能幫助,得益於

乾杯

編輯: 「F」 好了,現在我加SHGetKnownFolderPath,但在這裏,它使返回我這樣的字符串

static interface Shell32 extends Library { 

    public static final int  MAX_PATH   = 260; 
    public static final String FOLDERID_APPDATALOW = "{A520A1A4-1780-4FF6-BD18-167343C5AF16}"; 

    static Shell32 INSTANCE = (Shell32) Native.loadLibrary("shell32", 
        Shell32.class, OPTIONS); 

    public int SHGetKnownFolderPath(Guid.GUID rfid, int dwFlags, HANDLE hToken, 
        char[] pszPath); 
} 

public static void main(String[] args) { 

    char[] pszPath = new char[Shell32.MAX_PATH]; 
    Guid.GUID localLowId = Ole32Util.getGUIDFromString(Shell32.FOLDERID_APPDATALOW); 
    int hResult = Shell32.INSTANCE.SHGetKnownFolderPath(localLowId, 0, null, pszPath); 

    if (hResult == 0) { 
     String path = new String(pszPath); 
     int len = path.indexOf('\0'); 
     path = path.substring(0, len); 
     System.out.println(path); 
    } else { 
     System.err.println("Error: " + hResult); 
    } 

}

+0

您可能需要延長StdCallLibrary而因爲w32 API使用stdcall調用約定而不是庫。 – technomage 2011-07-08 00:27:36

回答

1

可以擴展Shell32(或創建自己的同等級),以獲得訪問SHGetKnownFolderPath API:

W32API.HRESULT SHGetKnownFolderPath(
          Guid.GUID rfid, 
          W32API.DWORD dwFlags, 
          W32API.HANDLE hToken, 
          char[] pszPath); 
1

這個問題有點老舊但是我設法解決了這個問題。 允許我解釋爲什麼Kyro方法不能很好地工作。這是因爲
SHGetKnownFolderPath使用一個POINTER而不是一個字符串或A字符數組(爲什麼顯示奇數輸出)。因此,你需要使用這樣的事情:

public int SHGetKnownFolderPath(Guid.GUID rfid, int dwFlags, HANDLE hToken, PointerByReference pszPath); 一個指針引用...

等等這種情況下,我附上我用一個例子:

static interface Shell32 extends StdCallLibrary { 
    public static final String FOLDERID_APPDATALOW = "{A520A1A4-1780-4FF6-BD18-167343C5AF16}"; 

    static Shell32 INSTANCE = (Shell32) Native.loadLibrary("shell32", 
        Shell32.class, W32APIOptions.UNICODE_OPTIONS); 

    public int SHGetKnownFolderPath(Guid.GUID rfid, int dwFlags, HANDLE hToken, 
        PointerByReference pszPath); 
} 

public static void main(String[] args) { 
    Guid.GUID localLowId = Ole32Util.getGUIDFromString(Shell32.FOLDERID_APPDATALOW); 
    PointerByReference e= new PointerByReference(); 
    int hResult = Shell32.INSTANCE.SHGetKnownFolderPath(localLowId, 0, null, e); 

    if (hResult == 0) { 
     char delim='\0'; 
     char Array[]=e.getValue().getCharArray(0,255); 
     for (int i = 0; i < Array.length; i++) { 
     if(Array[i]==delim){ 
      char temparr[]=new char[i]; 
      System.arraycopy(Array,0,temparr,0,i); 
      Array=temparr; 
      break; 
     } 
     } 
     /*dont forget to release the Pointer*/ 
     Ole32.INSTANCE.CoTaskMemFree(e.getValue()); 
     System.out.println(Array); 
    } else { 
     System.err.println("Error: " + hResult); 
    } 

} 
private static interface Ole32 extends StdCallLibrary { 

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

    void CoTaskMemFree(Pointer pv); 
} 
+0

感謝您的回答,但我最終使用了deploy.jar中的Cache.getCacheDir():http://javasourcecode.org/html/open-source/jdk/jdk-6u23/com/sun/deploy/cache/Cache。 HTML(我主要想訪問LocalLow來獲取Java緩存文件夾...) – Kyro 2012-08-28 18:17:45