Получить каталог поддержки приложений (и другие) в коде C - PullRequest
0 голосов
/ 22 января 2012

Мне нужно получить каталог поддержки приложений из кода C (поэтому я не верю, что могу использовать NSSearchPathForDirectoriesInDomains () и аналогичные).Есть ли способ сделать это помимо жесткого кодирования пути (чтобы он мог учитывать такие вещи, как песочница)?

Ответы [ 2 ]

1 голос
/ 22 января 2012

Хотя NSSearchPathForDirectoriesInDomains() является функцией C, она использует вызовы Foundation, которые включают пулы автоматического освобождения, поэтому вы не можете вызывать ее из чистого кода C (ну, вы можете, но она выдаст предупреждения об утечке пула). Таким образом, минималистичный подход - создать крошечный файл Obj-C-оболочки:

#include <Foundation/Foundation.h>

CFArrayRef appSupport() {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   CFArrayRef a = (CFArrayRef) NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory ,NSUserDomainMask, YES);
   CFRetain(a);
   [pool release];
   return a;
}

Тогда вы можете иметь дело с остальными в чистом C, например:

CFArrayRef a = appSupport();
if (CFArrayGetCount(a) > 0) { /* let's get the first value */
  CFStringRef s = CFArrayGetValueAtIndex(a, 0);
  char path[PATH_MAX];
  CFStringGetFileSystemRepresentation(s, path, sizeof(path));
  /* path now has what you want */
}
CFRelease(a);

Я не знаю ни о каком прямом CF API, который дал бы путь.

1 голос
/ 22 января 2012

Objective-C совместим с C. Таким образом, вы можете просто обернуть ваш вызов на NSSearchPathForDirectoriesInDomains() внутри простой функции C и получить, что он возвращает const char * для доступа к нему из вашего другого (не совместимого с Какао) кода C.Вы должны будете ссылаться на соответствующие библиотеки OSX.

...