2011-05-22 160 views
1

是否可以使用其他程序打開程序?例如: 我想在C中創建一個命令行應用程序,它將提示用戶輸入程序的名稱(可以說是Microsoft Word.app),並且該程序將啓動。我會做這樣的事情:使用popen()在命令行中打開一個程序?

#include <stdio.h> 
#include <time.h> 
int main (int argc, const char * argv[]) { 
    char programName[1000]; 
    printf("Type in the name of the program you would like to open: "); 
    scanf("%s", programName); 
    popen(programName); 
} 

但是,popen()問我另一個字符。我將如何去使用popen()來打開程序?

編輯:下面的代碼工程!

#include <stdio.h> 
#include <time.h> 

int main (int argc, const char * argv[]) { 
    char programName[1000]; 
    char app[100] = ".app"; 
    char openApp[100] = "open /Applications/"; 
    printf("Type in the name of the program you would like to open: "); 
    scanf("%s", programName); 
    strcat(openApp, programName); 
    strcat(openApp, app); 
    system(openApp); 

} 
+0

雖然你的下面的代碼工作,它已經從在運行崩潰的可能性在strcat中的緩衝區中,您正在將一個可能爲1000個字符的數組添加到最多隻能容納100個字符的目標中。 char openApp [100];至少必須是char openApp [100 + 1000 + 20]; – 2014-02-20 15:11:26

回答

7

popen可以讓你啓動一個程序,並得到一個文件描述符到它的輸入或輸出,就像fopen作品文件。例如,如果你想讀取你的程序的輸出,你會使用popen("program", "r")。另一方面,如果你想寫入它的輸入,你可以使用popen("program", "w")。 Mac OS X還支持r+,它允許您讀取輸出並寫入輸入,但此功能不是標準功能,不應該依賴於跨平臺代碼。

如果你只是想啓動一個程序,你不妨使用system函數,它會這樣做,並等待程序退出,然後返回狀態碼。 system實際上調用shell來工作,所以參數將經歷擴展(環境變量,〜等)。

編輯繼您的評論system("Microsoft Word.app")無法正常工作:實際上有幾個原因。從獲得的消息開始:這是因爲您寫的內容等同於打開終端窗口並鍵入Microsoft Word.app。換句話說,它試圖找到一個名爲「Microsoft」的程序,然後將它傳遞給參數「Word.app」。您需要引用程序名稱或轉義空格讓shell知道它是一個完整的程序名稱,而不是程序名稱,然後是參數:system("Microsoft\ Word.app")

現在,應該抱怨說shell找不到程序「Microsoft Word.app」,這已經是一個進步。

這是因爲在Mac OS上,app文件不是可執行文件:它們是Finder顯示爲單個文件的文件夾。您可以通過ctrl +單擊(或右鍵單擊)應用程序並選擇「顯示包內容」(這將打開應用程序文件夾)來驗證。 Microsoft Word.app的實際可執行文件必須位於Microsoft Word.app/Contents/MacOS/Microsoft Word路徑的某處。

正如你所看到的,這樣會變得很複雜。幸運的是,Apple提供了open可執行文件,它可以使用一堆OS服務來找出這些細節。它允許以下列方式啓動應用程序:

open -a Microsoft\ Word 

這應該啓動Word。 (注意你如何仍然需要逃離的空間。)在純C代碼,這將讓你像這樣:

system("open -a Microsoft\\ Word"); 

如果您選擇使用的Objective-C和Cocoa,然而,有一個很簡單的方法來打開應用程序:

NSString* appName = @"Microsoft Word"; // no escape! 
[[NSWorkspace sharedWorkspace] launchApplication:appName]; 

NSString對象可以從C字符串很輕鬆地創建:

NSString* appName = [[NSString alloc] initWithCString:programName encoding:NSUTF8StringEncoding]; 
[[NSWorkspace sharedWorkspace] launchApplication:appName]; 
[appName release]; 
+0

@zneak 當我這樣做時,它說沒有找到命令。我假設我做錯了什麼。 鍵入您想要打開的程序的名稱:正在運行... Microsoft Word.app sh:Microsoft:command not found – Mike 2011-05-22 15:38:16

+0

哦我正在使用Mac – Mike 2011-05-22 15:40:18

+0

@Mike,我已完成編輯我的答案。抱歉耽擱了! – zneak 2011-05-22 15:48:46

2

這將是更好地使用system(3)用於此目的。

popen(3)函數建立一個可以由調用者讀取或寫入的管道。但GUI應用程序不使用標準輸入和標準輸出,它們連接到圖形界面服務器,有時稱爲"window server".該服務器已在運行,並且已經決定了它的鍵盤輸入是什麼,並且它始終將其輸出寫入視頻設備。

要開始的.app你應該實際運行open(1)程序,所以你可以試試:

system("open /Applications/MacVim.app"); 
+0

這最終在查找器中打開應用程序位置 – Mike 2011-05-22 15:59:30

+0

This Works!謝謝! – Mike 2011-05-22 16:04:56

相關問題