3

OS X 10.9 でのみ使用できる関数を使用したいのですが、10.9 SDK でコンパイルする必要はありません。それは可能ですか?

弱いリンクを試みましたが、コンパイラは関数が定義されていないというエラーを出します。

4

4 に答える 4

3

C関数について話していると仮定すると、dlopen関数でこれを行うことができます:

#include <dlfcn.h>

int main() {
    void *lib = dlopen("/System/Library/Frameworks/ApplicationServices.framework/ApplicationServices", RTLD_LAZY);
    void *function = dlsym(lib, "CGColorGetConstantColor");

    // cast the function to the right format
    CGColorRef (*dynamic_getConstantColor)(CFStringRef colorName) = function;

    NSLog(@"%@", dynamic_getConstantColor(CFSTR("kCGColorBlack")));

    dlclose(lib);
}

出力:

2013-06-20 12:43:13.510 TestProj[1699:303] [ (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; 一般的なグレー プロファイル)] ( 0 1 )

ただし、最初に、必要な関数が存在する dylib を把握する必要があります。

これにより、iOS および Mac のサンドボックスの制限が解除される可能性が高くなります。これは、リンカーを回避しようとするために支払う代償です。

于 2013-06-19T14:26:31.717 に答える
0

Objective-C のメソッドを扱っている場合は、おそらくセレクターを使用して行うことができます。まず、セレクターが使用可能かどうかを確認します。

[object respondsToSelector:@selector(osxMavericksFun)]

そして、このテストが正しい場合は、セレクターを介してメソッドを起動してみてください

[object performSelector:@selector(osxMavericksFun)];

C関数を呼び出したい場合、これを行う方法はありません。

于 2013-06-19T14:01:34.957 に答える
0

このようにすればいい

if (AXIsProcessTrustedWithOptions != NULL){
    NSDictionary *options = @{(__bridge id)kAXTrustedCheckOptionPrompt: @YES};
    accessibilityEnabled = AXIsProcessTrustedWithOptions((__bridge CFDictionaryRef)options);
}else{
    accessibilityEnabled = AXIsProcessTrusted();
}

このメソッドは、アップルのドキュメント Listing 3-2 で説明されています。これは、あなたが正しいと認めた Richard J. Ross III によって記述された方法よりもはるかに簡単です。

于 2014-10-18T18:07:34.347 に答える