objective-c - Hook C 函数

标签 objective-c macos audio hook core-audio

我想在 Mac OS X 上挂接一个 C 函数。它是 AudioUnitInitialize,这样我就可以创建回调并将音频保存到文件中。我通过 this page 的教程获得了 Mobile Substrate 框架。这是我使用 MSHookFunction Hook 该函数的代码。

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 是 AudioComponentInstance 的类型定义

关于objective-c - Hook C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923884/

相关文章:

ios - 使用 Storyboard 中的属性字符串本地化 UILabel

objective-c - Objective-C 中的动态类型和返回值

objective-c - 如何释放通过 objc_setAssociatedObject 关联的对象?

iphone - 在编辑模式下如何确定 UITableViewCell 删除按钮的原点 (x,y)?

SwiftUI - 如果在 ForEach 循环中

c++ - 在 Xcode 中传递指针时出错,但在 Windows 上的 Codeblocks 中有效

java - 如何刷新 AudioRecord 对象中的缓冲区?

Javascript 在点击时播放声音,第二个按钮点击停止第一个声音

android - Android中的一个简单的实时麦克风

macos - 如何在新的 macOS 版本上为旧版本创建 Homebrew 瓶?