- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到的情况是,我的 .dmg 文件将位于包含我的应用程序的可移动存储设备上。当我双击它时,它将安装在我的本地计算机上,并且安装的卷内将是我的 .app (应用程序文件)。现在,我希望我的应用程序在我的 dmg 文件安装到本地计算机上后自动启动。现在我的应用程序还需要有关实际 dmg 文件所在位置的信息,例如其在可移动存储设备上的路径。这是否可能,如果可以,我如何找到挂载该卷的 dmg 文件的路径。
谢谢
最佳答案
在 Mac OS X 中无法自动启动应用程序。存在一些安全原因。唯一可以自动启动的是 .pkg
文件,而且只能通过 Safari AFAIK。
可以确定应用程序所在的 DMG 文件。为此,您必须使用 IOKit。尝试使用 IORegistryExplorer。
这是我第一次尝试使用 IOKit,它是出于其他目的,但仍然应该有帮助。
// hopefully all needed headers
#include <sys/stat.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOBSD.h>
#include <CoreFoundation/CoreFoundation.h>
/* First we want to get the major and minor BSD number
* of the DMG that our app is residing on.
*
* char *path is the path of a file that resides on the disk image.
* It is like this: /Volumes/Partition Name/SomeFile
* The simplest method to get such a path is to ask
* NSBundle for the path of the executable.
*/
// look up device number with stat
char *path = "path/to/app";
struct stat stats;
if (stat(path, &stats) != 0) {
return;
}
int bsd_major = major(stats.st_dev);
int bsd_minor = minor(stats.st_dev);
/* Now that we've got the BSD numbers we have to locate the
* IOService that has those numbers. IOKit works with
* CoreFoundation types.
*/
CFTypeRef keys[2] = { CFSTR(kIOBSDMajorKey), CFSTR(kIOBSDMinorKey) };
CFTypeRef values[2];
values[0] = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &bsd_major);
values[1] = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &bsd_minor);
CFDictionaryRef matchingDictionary;
matchingDictionary = CFDictionaryCreate(kCFAllocatorDefault,
&keys, &values,
sizeof(keys) / sizeof(*keys),
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFRelease(values[0]);
CFRelease(values[1]);
// IOServiceGetMatchingService uses up one reference to the dictionary
io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault,
matchingDictionary);
if (!service) {
return;
}
/* Now this part is quite different from what I need
* for my application. I'm not sure how this works
* because I'm currently not at my Mac and cannot try it.
*
* You need to go up the IOService chain. It looks like this:
+-o IOHDIXHDDriveOutKernelUserClient
+-o IODiskImageBlockStorageDeviceOutKernel <---- You want to get up here
+-o IOBlockStorageDriver
+-o Apple UDIF read-only compressed (zlib) Media
+-o IOMediaBSDClient
+-o IOApplePartitionScheme
+-o Apple@1
| +-o IOMediaBSDClient
+-o disk image@2 <---- This is the matched IOService!
+-o IOMediaBSDClient
*
* IODiskImage... has a property "Protocol Characteristics" which is a
* dictionary that has the key "Virtual Interface Location Path" which is
* the path to the disk image. There are probably #defines somewhere in
* IOKit for those keys.
*
* This code is NOT tested. It's out of my head and the documentation.
* This goes up 4 times in the hierarchy. Hopefully there aren't more
* than 1 parents.
*/
for (int i = 0; i < 4; i++) {
io_service_t parent;
IORegistryEntryGetParentEntry(service, kIOServicePlane, &parent);
IOObjectRelease(service);
service = parent;
}
/* Getting the property from the IOService is the last step:
*/
CFDictionaryRef characteristics;
characteristics = (CFDictionaryRef)IORegistryEntryCreateCFProperty(service,
CFSTR("Protocol Characteristics"),
kCFAllocatorDefault, 0)
CFStringRef *dmgPath = CFDictionaryGetValue(characteristics,
CFSTR("Virtual Interface Location Path"));
// clean up
IOObjectRelease(service);
CFRetain(dmgPath);
CFRelease(characteristics);
// Use the path
// later
CFRelease(dmgPath);
由于免费桥接支持,大部分工作都可以使用 Foundation 类而不是 CoreFoundation 类来完成。这使得它更容易、更易读。
<小时/>如果 IOBlockStorageDriver 的父 IOService 是 IODiskImageBlockStorageDeviceOutKernel,则上面的示例代码可以正常工作。如果父 IOService 的名称是“AppleDiskImageDevice”,则 IOService 链看起来有点不同:
+-o IOHDIXHDDriveOutKernelUserClient
+-o AppleDiskImageDevice <---- You want to get up here
+-o IOBlockStorageDriver
+-o Apple Disk Image Media <---- This is different
+-o IOMediaBSDClient
+-o IOApplePartitionScheme
+-o Apple@1
| +-o IOMediaBSDClient
+-o disk image@2 <---- This is the matched IOService!
+-o IOMediaBSDClient
在上面的for循环之后,您可以获取如下所示的图像文件路径URL字符串:
CFMutableDictionaryRef properties = nil;
IORegistryEntryCreateCFProperties(service, &properties, kCFAllocatorDefault, kNilOptions);
if (properties) {
CFStringRef url = CFDictionaryGetValue(properties, CFSTR("DiskImageURL"));
CFRelease(properties);
}
IOObjectRelease(service);
关于cocoa + dmg 文件 + 追溯其路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1785439/
在我的 chrome 控制台中,我试图了解导致调用某些 javascript 的步骤是什么文件。实际上,当我在单击输入文件标签后从我的计算机导入文件时,会调用一些 javascript 文件,但我不知
最近,我在 Kali Linux 中使用了 wifi phisher 工具。当我在列表中输入 AP 数量时,我在终端中得到以下跟踪: Traceback (most recent call last)
我叫米奇。以前,我在堆栈交换方面的数学和物理方面获得了惊人的帮助。我认为溢出是相关的,但我意识到我应该将这个问题放在一个问题上。我已经尝试了很多次,以尝试向自己介绍编程知识,特别是python,阅读全
我们内部开发了大约七个不同的网站。它们是跟踪不同人力资源申请并帮助我们的一些员工通过日程安排完成工作的网站。今天,首席软件设计师告诉我开始使用 phpUnit 为我们现有的代码编写测试用例。我们的主网
这是我的问题: 我使用 Subversion 有一段时间,直到我切换到 Git。又过了一些时间。 没有将历史从 Subversion 导入到 Git。这是一个严格的检查,删除 .svn 目录,然后是
我的目标是在这个gmail gem中找到调用save_attachments_to的地方自述文件示例: folder = "/where/ever" gmail.mailbox("Faxes").em
我在运行 C++ 应用程序时遇到段错误。在 gdb 中,它以某种方式显示我的一个指针位置已损坏。但是我在申请期间创建了 10 万个这样的对象指针。我怎样才能看到导致崩溃的一个我可以在 bt 命令中执行
我现在正在 BigQuery 中设置 GA4/Firebase 并使用 dbt在它之上进行分析。 由于这两个源的数据非常大,我想激活增量加载,只更新今天+昨天的分析模型(而不是每次都完全刷新所有数据)
我正在使用 React Redux。我的代码中的值似乎被覆盖了。我的已连接 (mapStateTo...) 组件的 this.props 来 self 的代码的未知部分。 我的任务直接链接到另一个关于
我一直在学习 Python 并从互联网上获取不同的东西并将它们全部放入我正在制作的这个游戏中:“你醒来......”这是一个基于文本的 assci RPG(滚动游戏)。它一直有效,直到出现此错误: T
上下文 由于使用 numpy.ma 模块进行掩码比直接 bool 掩码慢得多,因此我必须将后者用于我的 argmin/argmax-计算。 一点比较: import numpy as np # Mas
我在 Visual Studio 2013 中使用 asp.net mvc 迈出了第一步,但遇到了一个奇怪的问题。 我以 MVC 的形式开始了我的项目,并且没有选中“Web API”框来包含核心引用。
我是一名优秀的程序员,十分优秀!