为Wine和一些.exe文件创建包装器应用程序

时间:2013-05-03 14:57:58

标签: objective-c macos wine

我正在尝试编写一个将wine和一些.exe文件包装在一起的应用程序。应用程序将挂载WineBottlerCombo_1.2.5.dmg文件,然后它应该自动将已安装的Wine的正确内容复制到Application文件夹。完成此操作后,它应该运行.exe文件(由我指定)。

我的问题是:

  • 如何在不自动打开已安装的.dmg文件的情况下挂载.dmg文件
  • 如何将已安装的.dmg文件的内容复制到Application文件夹
  • 完成所有这些后,如何使用Objective-C运行.exe文件

我真的是Objective-C的初学者,但我正在努力解决这个问题。我是通过在Xcode中创建Cocoa应用程序开始的。在此之后,我设法使用此代码挂载.dmg文件(因为它会自动打开已安装的.dmg文件,非常适合阻止它):

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/hdiutil"];
[task setArguments:
 [NSArray arrayWithObjects: @"attach", @"/Users/<myusername>/Documents/temporary/WineBottlerCombo_1.2.5.dmg", nil]];
[task launch];
[task waitUntilExit];
if (0 != [task terminationStatus])
    NSLog(@"Mount failed.");
[task release];

在此之后,我尝试使用此代码将已安装的.dmg文件内容复制到Application文件夹:

if( [[NSFileManager defaultManager] isReadableFileAtPath: @"/Volumes/WineBottler Combo"] ) {
    [[NSFileManager defaultManager] copyItemAtPath: @"/Volumes/WineBottler Combo/Wine" toPath: @"/Volumes/WineBottler Combo/Applications" error:nil];
    [[NSFileManager defaultManager] copyItemAtPath: @"/Volumes/WineBottler Combo/WineBottler" toPath: @"/Volumes/WineBottler Combo/Applications" error:nil];
}
else {
    NSString* message = @"ERROR while moving file!";
    NSLog(@"%@", message);
}

不幸的是,这并没有将这些文件移动到Application文件夹。我对它进行了调试,并且它进入了if语句,所以它变为现实,但没有文件被移动到Application文件夹。

这是我被困的地方。我试图搜索互联网,但我还没有得到任何关于如何继续前进的信息,所以我想我在这里问。

提前感谢您的帮助。

编辑:

我检查了NSFileManager copyItemPath中的第三个参数,它说明了以下内容:

  

2013-05-04 11:16:03.493 TestApp_MacOSX_installer [10284:303]写入失败并显示错误:错误Domain = NSCocoaErrorDomain Code = 260“由于没有此类文件,无法打开文件”Wine“。” UserInfo = 0x10015a530 {NSFilePath = / Volumes / WineBottler Combo / Wine,NSUnderlyingError = 0x10015a430“操作无法完成。没有这样的文件或目录”}

我不知道它为什么没有这样的文件或目录,因为在程序安装后我在终端检查了这条路径并且路径正确,文件就在那里。

编辑编辑:

解决第一条EDIT错误消息:

我注意到我离开了我要复制的文件的扩展名。 所以正确的代码如下所示:

if( [[NSFileManager defaultManager] isReadableFileAtPath: @"/Volumes/WineBottler Combo"] ) {
    [[NSFileManager defaultManager] copyItemAtPath: @"/Volumes/WineBottler Combo/Wine.app" toPath: @"/Volumes/WineBottler Combo/Applications/Wine.app" error:&anyError];
    NSLog(@"Write failed with error: %@", anyError);
    [[NSFileManager defaultManager] copyItemAtPath: @"/Volumes/WineBottler Combo/WineBottler.app" toPath: @"/Volumes/WineBottler Combo/Applications/WineBottler.app" error:nil];
    NSLog(@"Write failed with error: %@", anyError);
}
else {
    NSString* message = @"ERROR while moving file!";
    NSLog(@"%@", message);
}

1 个答案:

答案 0 :(得分:2)

  • 关于mount:请参阅man hdiutil,看起来需要传递-nobrowse参数。
  • 复制:我建议您将第三个参数传递给方法(error:)并查看它的内容。
  • 要运行.exe文件,您可能需要运行wine可执行文件,并将.exe文件作为参数传递。与第一种情况中的方法相同:使用NSTask