2010-01-30 35 views
2

我刚开始使用Objective-C,我管理得很好。我最后的挑战是制作一个命令行实用程序,我可以在AppleScript中使用它。但是我的代码不起作用,不在终端中,不在AppleScript中。所以我问你,代码和平的错误是什么,应该是非常简单和容易的?设置文件的图标在命令行工具不起作用

int main(int argc, char *argv[]) { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

// -imagePath 
// -filePath 
NSUserDefaults *args = [NSUserDefaults standardUserDefaults]; 
NSString *soundPath = [args stringForKey:@"imagePath"]; 
NSString *filePath = [args stringForKey:@"filePath"]; 

BOOL worked = [[NSWorkspace sharedWorkspace] setIcon:[[NSImage alloc] initWithContentsOfFile:soundPath] forFile:filePath options:0]; 

NSLog(@"Worked: %i",worked); 

[pool release]; 
return 0; 
} 
+0

那么,当你运行它会发生什么? (除了泄漏图像,在这种情况下这是无害的,但却是一种不好的习惯)。 – 2010-01-31 00:05:40

+0

顺便说一下,它在我的机器上完美运行。 – Yuji 2010-01-31 03:00:19

回答

1
2010-01-31 17:03:24.317 iConChange[14848:10b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error (1002) creating CGSWindow' 

实际上,这意味着“你不能这样做,在一个命令行工具”。如果你在调试器中运行你的工具,它会告诉你堆栈跟踪中的“那个”。我的猜测是“那个”是创建NSImage。

另一种解决方案是重写该工具以使用Icon Services而不是NSWorkspace。您需要的API仍然可用并且不被弃用。

+0

亲爱的彼得,他的代码在我的10.6.2 Terminal.app上正常工作。可能是他/他在ssh会话中运行了它,而没有连接到窗口服务器,这是'NSWorkspace'方法可能需要的。我在无头旧G4机器上运行代码,并且因为窗口服务器无法连接而死机。 (尽管错误与他/她不一样)。 – Yuji 2010-02-01 03:40:11

+0

我在本地机器上运行NSImage驱动的命令行工具时遇到过类似的问题。我不认为我有问题简单地创建一个,这很奇怪,但我肯定有无法创建窗口例外。 – 2010-02-01 04:36:23

+0

NSImage依赖AppKit,其中AFAIK需要窗口服务器连接。 – 2010-02-01 06:40:38

0

终端:

macbook-van-ief2:~ ief2$ /Users/ief2/Desktop/iConChange/build/Debug/iConChange -filePath "~/Desktop/Naamloos.txt" -imagePath "~/Desktop/Z_Home_ZIcon.gif" 
2010-01-31 17:03:24.311 iConChange[14848:10b] _NXCreateWindow: error setting window property (1002) 
2010-01-31 17:03:24.317 iConChange[14848:10b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error (1002) creating CGSWindow' 
2010-01-31 17:03:24.322 iConChange[14848:10b] Stack: (
    2459177131, 
    2487344699, 
    2459176587, 
    2459176650, 
    2441787103, 
    2441786331, 
    2441785537, 
    2441784212, 
    2441781861, 
    2441794711, 
    2441793509, 
    2441762807, 
    2444980701, 
    2444978472, 
    2447881218 
) 
Trace/BPT trap 
+0

您是否通过从另一台机器登录而在'ssh'会话中运行? – Yuji 2010-01-31 23:19:24

0
2010-01-31 17:03:24.317 iConChange[14848:10b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error (1002) creating CGSWindow' 

实际上,这意味着“你不能这样做,在一个命令行工具”。如果你在调试器中运行你的工具,它会告诉你堆栈跟踪中的“那个”。

一种解决方案是将其重写为应用程序。也许是基于文档的文档,在文档窗口中具有图像视图,设置为接收拖动的图像和文件。