3

私はCarbonフレームワークを使用してMacOSXでC++プラグインを作成しています(ええ、ええ、AppleはCarbonを廃止していますが、現時点ではこのコードをCocoaに移行できません)。プラグインはマスターアプリケーションによってロードされます。プラグインのリソースにアクセスできるように、プラグインへのCFBundleRef参照を取得する必要があります。

問題は、プラグインの初期化ルーチン中にCFBundleGetMainBundle()を呼び出すと、プラグインではなく、ホストのバンドル参照への参照が返されることです。代わりにプラグインのバンドルへの参照を取得するにはどうすればよいですか?

注:ハードコードされた文字列識別子を使用してCFBundleGetBundleWithIdentifier()を呼び出すなど、コンパイル時に決定されたものは使用しません。

4

3 に答える 3

1

同様の状況のように思われるcarbon-devメーリングリストのこの投稿を参照してください。

そこに与えられた方法は

CFBundleGetBundleWithIdentifierの使用をお勧めします。プラグインには一意の識別子が必要です。「com.apple.dts.iTunes_plug-in」などのようなものです。プラグインのバンドルのinfo.plistでCFBundleIdentifierプロパティを探します。

于 2010-03-26T12:23:21.937 に答える
0

注:ハードコードされた文字列識別子を使用してCFBundleGetBundleWithIdentifier()を呼び出すなど、コンパイル時に決定されたものは使用しません。

それはウェットだからですよね?

そのソリューションをDRYにする方法は次のとおりです。

まず、次のように、ヘッダーファイルでこのためのいくつかのマクロを定義します。

#define MY_PLUGIN_BUNDLE_IDENTIFIER com.example.wiflamalator.photoshop-plugin
#define MY_PLUGIN_STRINGIFY(x) #x
#define MY_PLUGIN_BUNDLE_IDENTIFIER_STRING MY_PLUGIN_STRINGIFY(MY_PLUGIN_BUNDLE_IDENTIFIER)

ヘッダーファイルをを呼び出すコードにインポートしますCFBundleGetBundleWithIdentifier。そのコードでは、を使用しますCFSTR(MY_PLUGIN_BUNDLE_IDENTIFIER_STRING)

次に、Xcodeで、そのファイルをInfo.plistプレフィックスヘッダーとして設定するか、(すでに持っている場合は)#includeそのヘッダーに設定します。最後に、Info.plistで、バンドル識別子をMY_PLUGIN_BUNDLE_IDENTIFIER(もちろん文字列値で)に設定します。

これで、バンドルIDが正確に1つの場所(ヘッダー)に書き込まれ、そこからCプリプロセッサーが必要なすべての場所にバンドルIDを配置するため、を使用して独自のバンドルを検索できますCFBundleGetBundleWithIdentifier

于 2010-03-26T13:10:19.293 に答える