2011-08-04 5 views
0

요약 : Carbon이이 작업에 유효합니까? 아니면 덤프하고 코코아 솔루션을 찾아야합니까?Carbon API를 사용하여 jna를 통해 응용 프로그램을 시작할 수 있습니까?

클라이언트 시스템 (Snow Leopard 이상)을 조사하여 애플리케이션을 나열하는 애플릿을 쓰려고하면 주어진 단일 파일을 편집 할 수 있다고 주장합니다. 사용자가 응용 프로그램을 선택하면 내 애플릿이 Launch Services를 호출하여 파일을 인수로 사용하여 응용 프로그램을 시작합니다.

LSCopyApplicationURLsForURL을 호출하여 적합한 응용 프로그램 목록을 가져올 수 있습니다. FSPathMakeRef를 호출하여 파일 경로를 FSRef 개체로 변환 할 수 있습니다. 내가 할 수없는 일은 LSOPlURLsWithRole (인수 중 하나가 LSApplicationParameters 임)을 성공적으로 호출하기 위해 LSApplicationParameters 객체 (멤버 중 하나가 FSRef 임)를 사용하고 사용하는 것입니다. 지금까지 무슨 짓을

:

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에 대한 지원을 중단 한 것으로 보입니다. 내가 무엇을지지하고 무엇이 그렇지 않은지와 함께 서있는 곳은 나에게 분명하지 않습니다.

그래서 Carbon은이 활동을 위해 죽은 오리라고 결론을 내릴 수 있습니까? 아니면 내가 생각했던 것보다 더 가까이 있니? 텍사스

답변

0

는 탄소의 LSOpenApplication 포기하는 데, 내가 목표 - C와 자바를 해소하기 위해 Rococoa를 사용하는 솔루션을 구현했습니다. Cocoa 복합 메소드 이름을 openFile : withApplication과 같은 파일을 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)); 

저는 많은 다른 LaunchApplication 서비스에 여전히 Carbon을 사용하고 있습니다. java.net/projects/rococoa/가 그 집입니다. java.net/projects/rococoa/lists/users/archive에서 최소한의 잡담이 있다면 유용 할 것입니다.

관련 문제