SIMBL和mach_star有哪些优点和缺点?

时间:2011-01-03 16:21:21

标签: macos simbl

对于为Mac OS X应用编写黑客和非官方扩展,今天似乎有两种选择:SIMBLmach_star。我正在启动一个需要注入另一个进程的项目,我需要在这些库之间做出决定。

SIMBL与mach_star之间的方法和功能有何不同?为什么我会使用一个而不是另一个?

2 个答案:

答案 0 :(得分:3)

SIMBL:仅适用于可可应用程序。 (您无法管理Dock,Finder等应用程序)。易于使用。

mach_star:适用于所有类型的应用程序,可以连接平面API。有点困难。

使用哪个?取决于你想做什么?如果只是与一些可可调情,你的工作就是使用SIMBL,而不是mach_star。

答案 1 :(得分:1)

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命令和其他邪恶马赫方法交换魔法的例子。

要使用SIMBL并拥有插件,您开发的是一件事......您可以制作插件,每次查找器唤醒或安装mach_inject_bundle.framework时都不必担心注入取景器。

您可以自动在APP中使用这些插件:每次查找器重新启动/启动和/或应用程序启动时,您只需安装它们并注入代码

(消除注射的唯一方法是使用如下的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()//一旦用户批准一次,我们就有权在每次启动时注入查找器

{

//具有执行权限

if(框架未安装)

将mach_inject_bundle.framework安装到/ Library / Frameworks

使用您的包代码注入Finder

}

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];
  }
}