我在Mac应用程序中使用组件管理器来获取已安装组件的列表(我的应用程序是视频播放器,我想获取已安装的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 示例代码在编译 64 位时具有相同的问题。
知道我做错了什么吗? 我不想求助于手动查找组件并解析"thng"资源。
编辑:是否有可能在64位应用程序中,组件管理器仅列出64位组件? 在这种情况下,也许可以将此功能内置到 32 位共享库中,并从我的 64 位应用程序调用?
使用 QuickTime但是,当编译为 64 位时,CountComponents 仅返回 85 个组件(其中没有一个是我要查找的 QuickTime 编解码器(。
C API 的 QuickTime 编解码器仅为 32 位,Apple 尚未将该 API 移植到 64 位。请注意,在应用程序方面,您可以使用QTKit,新的Objective-C API。 QTKit尝试使用QuickTime X播放电影;如果因为没有合适的 QuickTime X 编解码器而无法使用,它会回退到 QuickTime 7,而 QuickTime 7 又能够使用旧的 QuickTime 组件。这对于使用 QTKit 的开发人员是透明的。
在 64 位应用程序中,组件管理器是否可能只列出 64 位组件?
是的,这是正确的。请注意,不可能在同一进程中混合使用 32 位和 64 位代码,因此组件管理器将查询限制为可加载到进程中的组件是有意义的:32 位组件用于 32 位进程,64 位组件用于 64 位进程。
在这种情况下,也许可以将此功能内置到 32 位共享库中,并从我的 64 位应用程序调用?
如上所述,您将无法将 32 位动态库加载到 64 位进程。您可以做的是创建一个单独的 32 位帮助程序可执行文件,并使用它来获取 32 位组件的列表。您可以在主应用程序和帮助程序可执行文件之间共享列出组件的源代码,但它们必须是单独的可执行文件。
事实上,如果您使用 QuickTime X 播放需要 32 位 QuickTime 组件的电影,您可以看到这一点:生成一个 32 位 QTKitServer 进程,以便使用 QuickTime 组件解码电影并将结果发送回 64 位 QuickTime X。您可能还想看看 QTKit 应用程序编程指南中的采用 QuickTime X 进行播放部分。