Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mac OS cocoa应用程序调用命令行工具在10.15中失败 < >我想创建一个可可应用程序来调用命令行工具,使用C++编写。 当使用Xcode调用命令行工具时,我可以做得很好。 但当我关闭Xcode时,它失败了,双击应用程序并按下更新按钮 运行命令行工具。 我已经厌倦了使用NSTask调用命令行工具,但它仍然失败。 这是我的密码 - (IBAction)Update:(id)sender { [self performSelectorOnMainThread:@selector(IspUpdate) withObject:nil waitUntilDone:YES]; } -(void)IspUpdate { strCurDir = [[NSBundle mainBundle] bundlePath]; NSRange range = [strCurDir rangeOfString:@"/" options:NSBackwardsSearch]; NSRange rangeDir = NSMakeRange(0, range.location + 1); strCurDir = [strCurDir substringWithRange:rangeDir]; NSString *strCmd = [strCurDir stringByAppendingString:@"ISPTool --isp --fw fw.bin --comm 6"]; dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{ system([strCmd UTF8String]); }); }_Xcode_Macos_Cocoa_Macos Catalina_Xcode Command Line Tools - Fatal编程技术网

Mac OS cocoa应用程序调用命令行工具在10.15中失败 < >我想创建一个可可应用程序来调用命令行工具,使用C++编写。 当使用Xcode调用命令行工具时,我可以做得很好。 但当我关闭Xcode时,它失败了,双击应用程序并按下更新按钮 运行命令行工具。 我已经厌倦了使用NSTask调用命令行工具,但它仍然失败。 这是我的密码 - (IBAction)Update:(id)sender { [self performSelectorOnMainThread:@selector(IspUpdate) withObject:nil waitUntilDone:YES]; } -(void)IspUpdate { strCurDir = [[NSBundle mainBundle] bundlePath]; NSRange range = [strCurDir rangeOfString:@"/" options:NSBackwardsSearch]; NSRange rangeDir = NSMakeRange(0, range.location + 1); strCurDir = [strCurDir substringWithRange:rangeDir]; NSString *strCmd = [strCurDir stringByAppendingString:@"ISPTool --isp --fw fw.bin --comm 6"]; dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{ system([strCmd UTF8String]); }); }

Mac OS cocoa应用程序调用命令行工具在10.15中失败 < >我想创建一个可可应用程序来调用命令行工具,使用C++编写。 当使用Xcode调用命令行工具时,我可以做得很好。 但当我关闭Xcode时,它失败了,双击应用程序并按下更新按钮 运行命令行工具。 我已经厌倦了使用NSTask调用命令行工具,但它仍然失败。 这是我的密码 - (IBAction)Update:(id)sender { [self performSelectorOnMainThread:@selector(IspUpdate) withObject:nil waitUntilDone:YES]; } -(void)IspUpdate { strCurDir = [[NSBundle mainBundle] bundlePath]; NSRange range = [strCurDir rangeOfString:@"/" options:NSBackwardsSearch]; NSRange rangeDir = NSMakeRange(0, range.location + 1); strCurDir = [strCurDir substringWithRange:rangeDir]; NSString *strCmd = [strCurDir stringByAppendingString:@"ISPTool --isp --fw fw.bin --comm 6"]; dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{ system([strCmd UTF8String]); }); },xcode,macos,cocoa,macos-catalina,xcode-command-line-tools,Xcode,Macos,Cocoa,Macos Catalina,Xcode Command Line Tools,请运行此演示,看看它是否与您正在尝试的类似。该代码将允许您通过单击按钮在应用程序的终端窗口中运行NSTask。将以下代码保存在名为“runCmd.m”的文件中,然后使用下面给出的说明从命令行编译: /* Run from Terminal using: clang runCmd.m -fobjc-arc -framework Cocoa -o runCmd && ./runCmd Should print current calendar when 'RunCommand'

请运行此演示,看看它是否与您正在尝试的类似。该代码将允许您通过单击按钮在应用程序的终端窗口中运行NSTask。将以下代码保存在名为“runCmd.m”的文件中,然后使用下面给出的说明从命令行编译:

/*
 Run from Terminal using: clang runCmd.m -fobjc-arc -framework Cocoa -o runCmd && ./runCmd
 Should print current calendar when 'RunCommand' button is hit.
*/

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate> {
 NSWindow *window;
}
 -(void) runMyCmd;
 -(void) buildMenu;
 -(void) buildWindow;
@end

@implementation AppDelegate

- (void) runMyCmd {
 NSTask *task = [[NSTask alloc] init];
 [task setLaunchPath: @"/bin/sh"]; 
 NSArray *args = [NSArray arrayWithObjects: @"-c", @"cal", nil];
 [task setArguments: args];
 NSPipe *pipe = [NSPipe pipe];
 [task setStandardOutput: pipe];
 [task launch];
 [task waitUntilExit];
 NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];
 NSString *string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
 NSLog (@"\n%@",string);
}

- (void) buildMenu {
 NSMenu *menubar = [NSMenu new];
 NSMenuItem *menuBarItem = [NSMenuItem new];
 [menubar addItem:menuBarItem];
 [NSApp setMainMenu:menubar];
 NSMenu *appMenu = [NSMenu new];
 NSMenuItem *quitMenuItem = [[NSMenuItem alloc] initWithTitle:@"Quit"
 action:@selector(terminate:) keyEquivalent:@"q"];
 [appMenu addItem:quitMenuItem];
 [menuBarItem setSubmenu:appMenu];
}

- (void) buildWindow {

 #define _wndW  200
 #define _wndH  150

 window = [[NSWindow alloc] initWithContentRect: NSMakeRect( 0, 0, _wndW, _wndH )
 styleMask: NSWindowStyleMaskTitled | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable
 backing: NSBackingStoreBuffered defer: NO];
 [window center];
 [window setTitle: @"Test window"];
 [window makeKeyAndOrderFront: nil];

// **** RunCmdButton **** //
 NSButton *runBtn =[[NSButton alloc]initWithFrame:NSMakeRect( 30, 60, 135, 30 )];
 [runBtn setBezelStyle:NSBezelStyleRounded ];
 [runBtn setTitle: @"RunCommand"];
 [runBtn setAction: @selector(runMyCmd)];
 [[window contentView] addSubview: runBtn];

// **** Quit btn **** //
 NSButton *quitBtn = [[NSButton alloc]initWithFrame:NSMakeRect( _wndW - 50, 5, 40, 40 )];
 [quitBtn setBezelStyle:NSBezelStyleCircular ];
 [quitBtn setTitle: @"Q" ];
 [quitBtn setAutoresizingMask: NSViewMinXMargin];
 [quitBtn setAction:@selector(terminate:)];
 [[window contentView] addSubview: quitBtn];
}

- (void) applicationWillFinishLaunching: (NSNotification *)notification {
 [self buildMenu];
 [self buildWindow];
}

- (void) applicationDidFinishLaunching: (NSNotification *)notification {
}

@end

int main () {
 NSApplication *application = [NSApplication sharedApplication];
 AppDelegate *appDelegate = [[AppDelegate alloc] init];
 [application setDelegate:appDelegate];
 [application run];
 return 0;
}


/*
使用以下命令从终端运行:clang runCmd.m-fobjc arc-framework Cocoa-o runCmd&./runCmd
点击“运行命令”按钮时应打印当前日历。
*/
#进口
@接口AppDelegate:NSObject{
NSWindow*窗口;
}
-(void)runMyCmd;
-(void)构建菜单;
-(无效)建筑窗;
@结束
@实现AppDelegate
-(void)runMyCmd{
NSTask*任务=[[NSTask alloc]init];
[任务集启动路径:@/bin/sh];
NSArray*args=[NSArray arrayWithObjects:@“-c”,“cal”,nil];
[任务集参数:args];
NSPipe*管道=[NSPipe pipe];
[任务设置标准输出:管道];
[任务启动];
[task waitUntilExit];
NSData*data=[[pipe fileHandleForReading]readDataToEndOfFile];
NSString*string=[[NSString alloc]initWithData:数据编码:NSUTF8StringEncoding];
NSLog(@“\n%@”,字符串);
}
-(void)构建菜单{
NSMenu*menubar=[NSMenu new];
NSMenuItem*menuBarItem=[NSMenuItem新];
[菜单栏附加项:菜单栏];
[NSApp SetMain菜单:菜单栏];
NSMenu*appMenu=[NSMenu new];
NSMenuItem*quitMenuItem=[[NSMenuItem alloc]initWithTitle:@“退出”
操作:@selector(terminate:)键等价物:@“q”];
[应用菜单附加项:quitMenuItem];
[菜单准则设置子菜单:应用菜单];
}
-(无效)构建窗口{
#定义_wndw200
#定义_wndh150
window=[[NSWindow alloc]initWithContentRect:NSMakeRect(0,0,wndW,wndH)
样式掩码:NSWindowsTyleMaskTitle | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskClosable | NSWindowsTyleMaskResizeble
backing:NSBackingStoreBuffered defer:NO];
[窗口中心];
[窗口设置标题:@“测试窗口”];
[window MakeKeyandDerfront:无];
//****运行cmdButton****//
NSButton*runBtn=[[NSButton alloc]initWithFrame:NSMakeRect(30,60,135,30)];
[runBtn setBezelStyle:NSBezelStyleRounded];
[runBtn setTitle:@“RunCommand”];
[runBtn setAction:@selector(runMyCmd)];
[[window contentView]添加子视图:runBtn];
//****退出btn****//
NSButton*quitBtn=[[NSButton alloc]initWithFrame:NSMakeRect(_wndW-50,5,40,40)];
[quitBtn setBezelStyle:nsbezelstyle循环];
[quitBtn setTitle:@“Q”];
[quitBtn setAutoresizingMask:NSViewMinXMargin];
[quitBtn setAction:@selector(terminate:)];
[[window contentView]添加子视图:quitBtn];
}
-(无效)应用程序将完成启动:(NSNotification*)通知{
[自建菜单];
[自建窗口];
}
-(无效)ApplicationIDFinishLaunching:(NSNotification*)通知{
}
@结束
int main(){
NSApplication*应用程序=[NSApplication sharedApplication];
AppDelegate*AppDelegate=[[AppDelegate alloc]init];
[应用程序setDelegate:appDelegate];
[应用程序运行];
返回0;
}

显示您尝试使用
进程
NSTask
)类的代码。
Process
类是从Cocoa应用程序运行命令行程序的方式。使用此代码更新您的问题,以及尝试调用命令行程序时出现的错误。1。通过在appBundle/Contents/MacOS中打开启动路径为/usr/bin/open,后跟可执行路径参数的可执行文件来启动应用程序。2.然后使用update按钮运行另一个NSTask,这次使用/bin/sh的启动路径将命令添加到第一个终端窗口。