Могу ли я использовать Carbon API для запуска приложения через jna? - PullRequest
0 голосов
/ 04 августа 2011

Вкратце: допустим ли Carbon для этой задачи, или я должен выбросить его и найти решение Какао?

Попытка написать апплет, который опрашивает клиентскую систему (Snow Leopard и более поздние версии) для вывода списка приложений.утверждают, что могут редактировать один файл.Пользователь выбирает приложение, и мой апплет затем вызывает Launch Services для запуска приложения с файлом в качестве аргумента.

Я могу получить список подходящих приложений, вызвав LSCopyApplicationURLsForURL.Я могу преобразовать путь к файлу в объект FSRef, вызвав FSPathMakeRef.Что я не могу сделать, так это создать и использовать объект LSApplicationParameters (один из членов которого является FSRef) для успешного вызова LSOPenURLsWithRole (один из аргументов которого является LSApplicationParameters).

Что я сделал до сих пор: interface MyCarbonWrapper extends com.sun.jna.Library<br /> {<br /> public static final MyCarbonWrapper INSTANCE =<br /> (MyCarbonWrapper) Native.loadLibrary("Carbon", MyCarbonWrapper.class);<br /> // .. various function declarations, including<br /> com.sun.jna.Pointer LSCopyApplicationURLsForURL(Object curlRef, int rolesMask);<br /> int FSPathMakeRef(Object path, PointerByReference ref, Void isDirectory);<br /> int LSOpenURLsWithRole(Pointer ptrArray, int roles, Void inAEParam,<br /> Structure myLSApplicationParams, Void outPsns, int inMaxPSCount);<br /> }<br /> <br /> // unsuccessful attempt to define a mapped LSApplicationParameters<br /> public static class LSApplicationParameters<br /> {<br /> public int version;<br /> public int flags;<br /> public Pointer Application;<br /> public Void asyncLaunchRefCon;<br /> public Void environment;<br /> public Void argv;<br /> public Void initialEvent;<br /> public static final int sizeof = 28;<br /> }<br /> <br /> public void openWith(String filePath)<br /> {<br /> // create a CURLRef for the selected application - OK<br /> // Create a FSRef from the CURLRef - OK<br /> // Create a CFArray to contain the file argument - OK<br /> // create and attempt to populate a LSApplicationParameters instance - problematic<br /> // call LSOpenURLsWithRole - failure. Returned error code is -50<br /> }<br /> Возвращенный код ошибки, который я обычно получаю, я понимаю, чтобы отобразить на сообщение:«Ошибка в списке параметров пользователя».

Насколько я могу судить, Snow Leopard, похоже, отказался от поддержки ряда API, которые принимают FSRef в качестве аргумента.Мне совсем не ясно, где я стою с тем, что поддерживается, а что нет.

Итак, я должен заключить, что Карбон - мертвая утка для этой деятельности?Или я ближе, чем я думаю?

Tx

1 Ответ

0 голосов
/ 19 августа 2011

Отказавшись от LSOpenApplication компании Carbon, я реализовал решение, которое использует Rococoa для соединения Objective-C и Java. Нет необходимости переводить имена составных методов Какао, например 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));

Я все еще использую Carbon для ряда других сервисов LaunchApplication. java.net/projects/rococoa/ является его домом, с некоторыми полезными, хотя и минимальными разговорами на java.net/projects/rococoa/lists/users/archive

...