3

CFBundleCopyExecutableURL関数は、絶対URLを返す場合と、返さない場合があります。CFBundleCopyExecutableURLの前にCFBundleCopyExecutableArchitecturesを呼び出すと、URLは絶対になります(なぜですか?)。この関数を強制して常に絶対URLを返すにはどうすればよいですか?ありがとう。

text getBundleExeutableUrl(text bundlePath)
{
    CFURLRef url = CFURLCreateFromFileSystemRepresentation(0,
        (char*)bundlePath.c_str(), bundlePath.length(), false);
    CFBundleRef bundle = CFBundleCreate(0, url);
    CFBundleCopyExecutableArchitectures(bundle); // this is necessary to get absolute path
    CFURLRef exeUrl = CFBundleCopyExecutableURL(bundle);
    CFStringRef srExe = CFURLCopyFileSystemPath(exeUrl, 0);
    text bundleExe = srExe;
    CFRelease(srExe);
    CFRelease(exeUrl);
    CFRelease(url);
    CFRelease(bundle);
    return bundleExe;
}
4

1 に答える 1

2

ソースコードに、を参照するこの余分な行を追加しますCFURLCopyAbsoluteURL

CFURLRef exeUrl = CFBundleCopyExecutableURL(bundle);
CFURLRef absoluteURL = CFURLCopyAbsoluteURL(exeURL);
CFStringRef srExe = CFURLCopyFileSystemPath(absoluteURL, 0);
CFRelease(absoluteURL); // don't forget to release what you create

" CFURLCopyAbsoluteURL"は相対URLを絶対URLに変換します。

コードにエラーチェック行も含まれている可能性があります(たとえば、続行する前にURLがNULLでないことを確認してくださいなど)。

また、私が言及したかったスタイルの1つは、オブジェクトと変数の宣言(たとえば、 " text")は通常大文字になっている(たとえば、 " CFStringRef"、 " NSString"など)ということです。パラメータと変数名は小文字で始まります。また、「text」は紛らわしいです。それを「」と呼んでCFStringRefください。

于 2012-06-11T15:34:32.923 に答える