Objective c 钩住C函数

Objective c 钩住C函数,objective-c,macos,audio,hook,core-audio,Objective C,Macos,Audio,Hook,Core Audio,我想在Mac OS X上挂接一个C函数。它是AudioUnitInitialize,因此我可以创建回调并将音频保存到文件中。我得到了移动基板框架与教程从。这是我用MSHookFunction挂接该函数的代码 static OSStatus (*AudioUnitInitialize_original)(AudioUnit aInUnit); OSStatus AudioUnitInitialize_hooked(AudioUnit aInUnit) { NSLog(@"AudioUnit

我想在Mac OS X上挂接一个C函数。它是
AudioUnitInitialize
,因此我可以创建回调并将音频保存到文件中。我得到了移动基板框架与教程从。这是我用
MSHookFunction
挂接该函数的代码

static OSStatus (*AudioUnitInitialize_original)(AudioUnit aInUnit);
OSStatus AudioUnitInitialize_hooked(AudioUnit aInUnit)
{
    NSLog(@"AudioUnitInitialize_hooked -> START");

    OSStatus __return = AudioUnitInitialize_original(aInUnit);

    NSLog(@"%p", aInUnit);
    NSLog(@"%@", aInUnit); // Here the target application crashes.

    NSLog(@"AudioUnitInitialize_hooked -> END");
    return __return;
}

...

MSHookFunction(AudioUnitInitialize, AudioUnitInitialize_hooked, &AudioUnitInitialize_original);

这里有什么问题?我可以记录音频单元的地址,但不能记录更多?是否有使用函数参数的解决方案?

AudioUnit类型不是Objective-C对象,实际上是指向结构指针的typedef。您不能对其使用
NSLog()
中的
%@
格式说明符


AudioUnit是一种类型定义,您可以参考

除了第一段中相当可疑的自我认同声明外,下一页内容如下:

“从概念上讲,MSHookFunction()将编写跳转到替换函数的指令,并在自定义内存位置上分配一些字节,该位置具有原始剪切指令并跳转到挂钩函数的其余部分。由于在iPhoneOS上,默认情况下内存页不能同时可写和可执行,因此必须为MSHookFu应用内核补丁“我的任务是工作。”

我有点惊讶,任何这样做的尝试都不会导致内存保护失败

正统的C和C++函数的交互是在库中提供自己的实现,并确保链接器在CoeEdioFrWorkWork版本之前到达它。