2011-08-04 69 views
0

簡而言之:Carbon是否適用於此任務,或者我應該轉儲它並尋找Cocoa解決方案?我可以使用Carbon API通過jna啓動應用程序嗎?

試圖編寫一個詢問客戶端系統(Snow Leopard及更高版本)列出應用程序聲明能夠編輯單個給定文件的小程序。用戶選擇一個應用程序,然後我的小程序調用啓動服務啓動應用程序,並將該文件作爲參數。

我可以通過調用LSCopyApplicationURLsForURL來獲取符合條件的應用程序列表。 我可以通過調用FSPathMakeRef將文件路徑轉換爲FSRef對象。 我不能做的是構造並使用LSApplicationParameters對象(其中一個成員是FSRef),以便成功調用LSOPenURLsWithRole(其中一個參數是LSApplicationParameters)。

我迄今所做的是什麼:

interface MyCarbonWrapper extends com.sun.jna.Library
{
public static final MyCarbonWrapper INSTANCE =
  (MyCarbonWrapper) Native.loadLibrary("Carbon", MyCarbonWrapper.class);
// .. various function declarations, including
  com.sun.jna.Pointer LSCopyApplicationURLsForURL(Object curlRef, int rolesMask);
  int FSPathMakeRef(Object path, PointerByReference ref, Void isDirectory);
  int LSOpenURLsWithRole(Pointer ptrArray, int roles, Void inAEParam,
    Structure myLSApplicationParams, Void outPsns, int inMaxPSCount);
}

// unsuccessful attempt to define a mapped LSApplicationParameters
public static class LSApplicationParameters
{
public int version;
public int flags;
public Pointer Application;
public Void asyncLaunchRefCon;
public Void environment;
public Void argv;
public Void initialEvent;
public static final int sizeof = 28;
}

public void openWith(String filePath)
{
  // create a CURLRef for the selected application - OK
  // Create a FSRef from the CURLRef - OK
  // Create a CFArray to contain the file argument - OK
  // create and attempt to populate a LSApplicationParameters instance - problematic
  // call LSOpenURLsWithRole - failure. Returned error code is -50
}


返回的錯誤代碼,我通常我理解映射到消息:
「錯誤的用戶參數列表」。

據我所知,Snow Leopard似乎已經放棄了對以FSRef作爲參數的一系列API的支持。對於我而言,支持什麼和什麼不支持我的立場並不清楚。

所以我應該得出結論碳是這個活動的死鴨?或者我比我想象的更接近?

的Tx

回答

0

已經放棄了對碳的LSOpenApplication,我實現它使用Rococoa彌合的Objective-C和Java的解決方案。不是翻譯Cocoa複合方法名稱的必要性,例如openFile:withApplication to openFile_withApplication。

// Declare an interface which will call on a rococoa class: 

public interface NSWorkspace extends NSObject 
{ 

    public static final _Class CLASS = Rococoa.createClass("NSWorkspace", _Class.class); 

    public interface _Class extends NSClass 
    { 
     // static method to get the workspace in 
     NSWorkspace sharedWorkspace(); 
    } 
    boolean openFile_withApplication(NSString fullPath, NSString appName); 
} 

// then we can call on it to do stuff 

final NSWorkspace nsWorkspace = NSWorkspace.CLASS.sharedWorkspace(); 
boolean isRunning = nsWorkspace.openFile_withApplication(
    NSString.stringWithString(targetFilePathStr), 
    NSString.stringWithString(executableApplicationPathStr)); 

我還在使用Carbon作爲其他許多LaunchApplication服務。 java.net/projects/rococoa/是它的家,在java.net/projects/rococoa/lists/users/archive上有一些非常有用的聊天記錄

相關問題