我发现我的设备使用IOServiceGetMatchingServices并获得了这样的属性字典:

kernResult = IORegistryEntryCreateCFProperties(nextMedia,
                    (CFMutableDictionaryRef *)&props,
                                              kCFAllocatorDefault, 0);

从那个字典我可以提取图标的信息:

NSString *bId = [props valueForKeyPath:@"IOMediaIcon.CFBundleIdentifier"];
NSString *rFile = [props valueForKeyPath:@"IOMediaIcon.IOBundleResourceFile"];

这两个人给我这个(作为一个例子):

com.apple.iokit.IOStorageFamily   (Bundle identifier)
Internal.icns                     (Resource File)

我尝试使用此方法提取图标:

NSBundle *bundleWithIcon = [NSBundle bundleWithIdentifier:bId];
NSString *iconPath = [bundleWithIcon pathForResource:rFile ofType:nil];

但是bundleWithIconnil

这甚至是获取图标的正确方法吗?

我想我必须以某种方式加载bundle才能用bundleWithIdentifier加载它,我该怎么做呢?

PS: 还有一个问题 (我认为)试图提出同样的问题,但只要求捆绑,而不是这是正确的方法。

#1楼 票数:7

您可以使用NSWorkspace。
初始图像为32x32,但它具有其他尺寸的表示,并将相应缩放

NSWorkspace * ws = [NSWorkspace sharedWorkspace];
NSImage * icon = [ws iconForFile:@"/Volumes/Whatever"];
NSLog(@"%@", [icon representations]); // see what sizes the icon has
icon.size = NSMakeSize(512, 512);

#2楼 票数:2 已采纳

就在最近, Andrew Myrick在darwin-dev邮件列表上回答了类似的问题

<IOKit/kext/KextManager.h> KextManagerCreateURLForBundleIdentifier()可能有用,但我相信它只适用于1)加载或2)/ S / L / E /中的kexts。 这是Snow Leopard标题:

 /*! * @function KextManagerCreateURLForBundleIdentifier * @abstract Create a URL locating a kext with a given bundle identifier. * * @param allocator * The allocator to use to allocate memory for the new object. * Pass <code>NULL</code> or <code>kCFAllocatorDefault</code> * to use the current default allocator. * @param kextIdentifier * The bundle identifier to look up. * * @result * A CFURLRef locating a kext with the requested bundle identifier. * Returns <code>NULL</code> if the kext cannot be found, or on error. * * @discussion * Kexts are looked up first by whether they are loaded, second by version. * Specifically, if <code>kextIdentifier</code> identifies a kext * that is currently loaded, * the returned URL will locate that kext if it's still present on disk. * If the requested kext is not loaded, * or if its bundle is not at the location it was originally loaded from, * the returned URL will locate the latest version of the desired kext, * if one can be found within the system extensions folder. * If no version of the kext can be found, <code>NULL</code> is returned. */ CFURLRef KextManagerCreateURLForBundleIdentifier( CFAllocatorRef allocator, CFStringRef kextIdentifier); 

请注意,在Snow Leopard之前,它可能仅适用于/ S / L / E中的kexts; API存在,但没有headerdoc描述其行为。

对我来说,这在Mac OS X 10.5上运行得非常好。

#3楼 票数:1

这可能对你有帮助。 (或者可能不是)...

在玩'ioreg'命令时,我遇到了一些让我想起你问题的东西,所以我会发布它:

尝试发出以下命令:

ioreg -c IOMedia -x

这将产生一大堆输出,看起来像这样:

  |     +-o IOBlockStorageDriver  <class IOBlockStorageDriver, registered, matched, active, busy 0, retain 7>
  |       +-o Apple read/write Media  <class IOMedia, registered, matched, active, busy 0, retain 9>
  |         | {
  |         |   "Removable" = Yes
  |         |   "BSD Unit" = 0x4
  |         |   "IOBusyInterest" = "IOCommand is not serializable"
  |         |   "BSD Minor" = 0xc
  |         |   "Ejectable" = Yes
  |   |         |   "BSD Name" = "disk4"
  |         |   "Leaf" = No
  |         |   "IOMediaIcon" = {"CFBundleIdentifier"="com.apple.iokit.IOStorageFamily","IOBundleResourceFile"="Removable.icns"}
  |         |   "Preferred Block Size" = 0x200
  |         |   "Whole" = Yes
  |         |   "Open" = Yes
  |         |   "Size" = 0x100000
  |         |   "Writable" = Yes
  |         |   "Content" = "Apple_partition_scheme"
  |         |   "IOGeneralInterest" = "IOCommand is not serializable"
  |         |   "Content Hint" = ""
  |         | }         |   "BSD Major" = 0xe

这一切都让我相信(因此盲目地建议您调查)如果你遍历与'IOMedia'匹配的io注册表树,你可以获得包含一个键入“IOMediaIcon”的条目的属性词典,它本身似乎是一个集合通知您包标识符和资源文件名。

不要说这很容易......但是请查看FireWire SDK以获取您可能需要的所有示例代码...无论如何,它可能比硬编码预填充路径“更好”(在未来的操作系统中可能会消失)版本)。

| K <

#4楼 票数:0

没有自定义图标的卷将显示一个操作系统的通用图标,您可以在此处硬编码路径。 具有自定义图标的卷将在其文件系统上存储该图标,如果未安装,则查找它完全是您的工作。

#5楼 票数:0

这两个人给我这个(作为一个例子):

com.apple.iokit.IOStorageFamily(Bundle identifier)Internal.icns(资源文件)

我尝试使用此方法提取图标:

NSBundle * bundleWithIcon = [NSBundle bundleWithIdentifier:bId]; NSString * iconPath = [bundleWithIcon pathForResource:rFile ofType:nil];

但是bundleWithIconnil

bundleWithIdentifier:要求您已经为具有该标识符的bundle创建了一个NSBundle实例; 它只查找以前创建的实例。 因此,您需要在文件系统中找到该bundle并通过pathname实例化它。 幸运的是,您似乎已经有了关于此问题的链接。

  ask by Georg Schölly translate from so

未解决问题?本站智能推荐:

4回复

如何在 Mac OS cocoa 中获取已安装 USB 设备的设备 ID、供应商 ID 和产品 ID

我正在尝试编写一个检测连接到 Mac OS 的 iPod 的 Cocoa 程序。 我正在听 NSWorkspaceDidMountNotification 和 NSWorkspaceDidUnmountNotification 以获取 USB 设备安装和卸载通知。 我可以使用 NSString *p
2回复

如何创建音频设备驱动程序来捕获声音Mac正在播放?

我已经创建了一些代码来使用AV Foundation对mov文件进行屏幕捕获,我的下一步是记录Mac播放的声音,以便以后添加到录制的视频中。 我做了一些挖掘,看起来我可能需要实现某种音频驱动程序来捕获音频。 关于如何实现这一点的任何指针? 我假设以某种方式需要AudioUnit和IOK
2回复

Mac鼠标/触控板速度编程

我正在尝试为我正在处理的应用程序更改鼠标跟踪速度(注意:不加速)。 我到处寻找一种方法来做到这一点,但找不到任何东西。 我怀疑这与我在IOKit / hidsystem Framework上给出的函数值有关: 作为mouseAcceleration的值,我怀疑有一个十六进制值定义了加
1回复

在Mac环境上为USBHIDManager HID,getReport()和setReport()

我们正在尝试与USB HIDDevice通信。 该设备在Windows中运行良好,我们可以在其中发送报告并使用WriteFile()和ReadFile()获取报告。 在Mac上,我们正在尝试使用setReoprt()和getReport()与设备进行接口。 但是getReport()不
2回复

可可在NSArray中获取磁盘

嗨,我正在使用DiskArbitration.framework获取磁盘列表 它可以正常登录,但是如何返回数组呢? 它只是循环,所以我什至不知道如何检查它是否完成。
1回复

使用IOKit与USB设备通信

我正在尝试创建一个与USB设备通信的应用程序,就像我在终端上使用screen命令一样。 为了使我的问题更容易理解,这就是我通常在终端中所做的事情: 命令: 回报: 接下来,我打电话给: 在此之后,我可以向设备发送命令(例如输入'U',获得响应) 我正试图
1回复

如果设备自引导后插入,IOHIDDeviceRegisterInputValueCallback将失败

我正在尝试使用IOKit与游戏控制器进行通信,特别是我希望使用IOHIDDeviceRegisterInputValueCallback通知值更改。 我的代码有效,除非设备已插入,因为Mac已启动且从未拔下插头。 在这种情况下, IOHIDDeviceOpen仍然成功,但永远不会调用值回调。
2回复

从Mac将数据发送到PS3 DualShock3控制器(IOHIDDeviceSetReport)

我最近在带有PS3控制器的Mac上一直在研究IOKit的HID部分。 我设法查看了示例代码并连接到我的控制器,接收了数据流并对其进行了解析(所有内容,包括加速度计和陀螺仪)。 但是,今天我决定要开始在设备背面设置LED并触发隆隆声电机,但我无法使其正常工作! 尽管Apple提供了用