我在Mac应用中使用Component Manager来获取已安装组件的列表(我的应用是a video player,我想查看已安装的QuickTime编解码器列表)。
我有这样的代码:
- (void) findComponents
{
ComponentDescription desc;
desc.componentType = 0;
desc.componentSubType = 0;
desc.componentManufacturer = 0;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
long numComps = CountComponents( &desc );
NSLog( @"found %ld components", numComps );
Component aComponent = 0;
while( (aComponent = FindNextComponent( aComponent, &desc) ) ) {
// Do stuff with this component.
}
}
当我编译我的应用程序32位时,它可以正常工作(927个组件从CountComponents返回)。但是,当编译64位时,CountComponents只返回85个组件(其中没有一个是我正在寻找的QuickTime编解码器)。
组件管理器文档没有对CountComponents / FindNextComponent的64位问题说些什么。值得注意的是(当然古老的)Apple DTS sample code upon which this code is based在编译64位时具有相同的问题。
任何想法我做错了什么?我不想采用手动查找组件和解析' thng'资源。
编辑:有可能在64位应用程序中,Component Manager只列出64位组件吗?在这种情况下,也许这个功能可以构建到32位共享库中,并从我的64位应用程序调用?答案 0 :(得分:1)
但是,当编译64位时,CountComponents只返回85个组件(其中没有一个是我正在寻找的QuickTime编解码器)。
使用QuickTime C API的QuickTime编解码器仅为32位,Apple尚未将该API移植到64位。请注意,在应用程序方面,您可以使用新的Objective-C API QTKit。 QTKit尝试使用QuickTime X播放电影;如果它不能,因为没有合适的QuickTime X编解码器可用,它会回退到QuickTime 7,而QuickTime 7又可以使用旧的QuickTime组件。这对使用QTKit的开发人员来说是透明的。
在64位应用程序中,Component Manager是否可能只列出64位组件?
是的,这是正确的。请注意,在同一进程中不可能混合使用32位和64位代码,因此有必要将Component Manager限制为可以加载到进程的组件的查询:32位的32位组件位处理,64位进程的64位组件。
在这种情况下,也许这个功能可以构建到32位共享库中,并从我的64位应用程序中调用?
如上所述,您将无法将32位动态库加载到64位进程。您可以做的是创建一个单独的32位帮助程序可执行文件,并使用它来获取32位组件的列表。您可以共享在主应用程序和帮助程序可执行文件中列出组件的源代码,但它们必须是单独的可执行文件。
事实上,如果您使用QuickTime X播放需要32位QuickTime组件的电影,您可以看到这一点:生成32位QTKitServer进程以使用QuickTime组件解码电影并发送结果返回到64位QuickTime X. John Siracusa describes this in his Snow Leopard Review。您可能还想查看Adopting QuickTime X for Playback section in QTKit Application Programming Guide。