Mac OS X アプリ用のハックと非公式の拡張機能を作成する場合、現在、SIMBLとmach_star
. 別のプロセスに挿入する必要があるプロジェクトを開始していますが、これらのライブラリのどちらかを決定する必要があります。
SIMBL と のアプローチと機能の違いは何mach_star
ですか? なぜ私は他のものを使用するのですか?
SIMBL: ココア アプリケーションでのみ動作します。(Dock、Finder などのアプリケーションを管理することはできません)。使いやすい。
mach_star: あらゆる種類のアプリケーションで動作し、フラットな API をフックできます。少し難しい。
どちらを使用しますか?やりたいことによる?ココアをいちゃつくだけで仕事ができる場合は、SIMBL を使用するか、mach_star を使用します。
SIMBL は mach_star から構築されました... コードに mach_star が含まれています...
SIMBL は SIMple BundleLoader です... 大文字に注意してください.... プラグインモジュールを ~/Library/Application Support/SIMBL/Plugins に保存し、ファインダーに自動的に挿入できるように設計されています..
/Library/Scripting Additions/SIMBL.osax にスタートアップ スクリプトがあります... このスクリプトは、mach_inject_bundle.framework を /Library/Frameworks にインストールし (私が思うに)、plist で指定されたターゲット プログラムにコードを挿入します。
mach_star には、mach_inject_bundle_pid コマンドやその他の悪質な mach メソッド スワップ マジックを実行する例がいくつかあります。
SIMBL を使用してプラグインを開発することは 1 つのことです... プラグインを作成でき、ファインダーが起動するたびにファインダーを挿入したり、mach_inject_bundle.framework をインストールしたりすることを心配する必要はありません。
アプリでこれらのプラグインを自動的に使用できます: ファインダーが再起動/起動するたび、および/またはアプリが起動するたびに、プラグインをインストールしてコードに挿入するだけです。
(インジェクションをなくす唯一の方法は、次のような AppleScript を使用することです。
tell application "Finder" to quit
delay 2.5
tell application "Finder" activate
または、mach_star コードを完成させて uninject mach を実装する必要があります... :(
プロフェッショナルで、プラグインを自動インストールするアプリを作成するには、次のことを行う必要があります: SMJobBless を使用して、mach_inject_bundle.framework ファイルがまだインストールされていない場合はそのインストールを実行するプログラムを祝福し、注入できるコードがあります。アプリケーションがロードされるたび、および/またはファインダーが再起動するたびにファインダー。
zerodivisi0n:Alexey Zhuchkov は、Erwan Barrier と同様に素晴らしい仕事をして、次のことを行うコードをアプリに埋め込む方法を説明しました。
(疑似コード)
AppDelegate ApplicaitonDidFinishLaunching:
SMJobBlessGetPermission() //ユーザーが 1 回承認すると、起動ごとにファインダーを挿入する許可を保持します
{
//管理者権限あり
if (フレームワークがインストールされていない)
mach_inject_bundle.framework を /Library/Frameworks にインストールします
ファインダーにバンドル コードを挿入する
}
https://github.com/twotreeszf/FinderMenu
https://github.com/erwanb/MachInjectSample
MachInjectSample から引用:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSError *error;
// Install helper tools
if ([DKInstaller isInstalled] == NO && [DKInstaller install:&error] == NO) {
assert(error != nil);
NSLog(@"Couldn't install MachInjectSample (domain: %@ code: %@)", error.domain, [NSNumber numberWithInteger:error.code]);
NSAlert *alert = [NSAlert alertWithError:error];
[alert runModal];
[NSApp terminate:self];
}
// Inject Finder process
if ([DKInjectorProxy inject:&error] == FALSE) {
assert(error != nil);
NSLog(@"Couldn't inject Finder (domain: %@ code: %@)", error.domain, [NSNumber numberWithInteger:error.code]);
NSAlert *alert = [NSAlert alertWithError:error];
[alert runModal];
[NSApp terminate:self];
}
}