2017-02-24 61 views
1

我已經嘗試過:如何打開/產卵與油嘴/ gtkmm的文件在Windows

GError *pError = NULL; 
    string uri = g_filename_to_uri(file.c_str(), NULL, &pError); 
    if (!g_app_info_launch_default_for_uri(uri.c_str(), NULL, &pError)) { 
     cout << "Failed to open uri: " << pError->message; 
    } 

在這裏,我得到錯誤「不支持的URI」。我在這裏創建的URI是錯誤的嗎?

我的第二個方法是派生的文件與異步的命令行:

file = quoteStr(file); 
    try { 
    Glib::spawn_command_line_async(file); 
    } catch (Glib::SpawnError error) { 
    cout << error.what(); 
    } catch (Glib::ShellError error) { 
    cout << error.what(); 
    } 

這裏油嘴:: SpawnError異常與錯誤拋出:「無法執行幫助程序(無效參數)」。我的意思是,當我在Windows cmd中執行帶引號的絕對文件路徑時,它會打開文件(在本例中爲pdf文件)。這個功能有什麼不同嗎?

+0

'我在這裏創建的URI是錯誤的嗎?'沒有你向我們展示這個URI是不可能的......但是對於你的第二個問題,請看我的答案;我懷疑你需要在你的路徑或者你自己的可執行文件所在的目錄下有'gspawn' helper可執行文件。當然,這爲我解決了同樣的問題。 –

回答

0

我有一個類似的問題,我不得不放棄使用圓滑做到這一點,最終實現一個簡單的跨平臺(贏,Mac和Linux)兼容的方式做到這一點:

// open an URI, different for each operating system 
void 
openuri(const char *url) 
{ 
#ifdef WIN32 
    ShellExecute(GetActiveWindow(), 
     "open", url, NULL, NULL, SW_SHOWNORMAL); 
#elif defined(__APPLE__) 
    char buffer[512]; 
    ::snprintf(buffer, sizeof(buffer), "open %s", url); 
    ::system(buffer); 
#else 
    char buffer[512]; 
    ::snprintf(buffer, sizeof(buffer), "xdg-open %s", url); 
    ::system(buffer); 
#endif 
} 

...這不是很好,但它很小,它的工作原理:)

+0

是的,它的作用太大了,但我確實希望只用它作爲最後一種方法。還是謝謝你的樣品! –

+0

這會在您的應用程序中引入任意的shell代碼執行漏洞(來自'url',它不會被轉義)並且不應該使用**。一般來說,應該儘可能避免使用system()系統調用;很少有可以安全使用的普遍適用的情況。 –

0

希望這是相關的,可以提供一個真正的答案,而不僅僅是一個(聰明!)的解決方法。

我遇到了一個奇怪的情況:啓動一個文件(特別是一個HTML文檔)g_app_info_launch_default_for_uri()gtk_show_uri_on_window()工作時,可執行文件從我的生成目錄運行。但是,如果我將exe複製到另一個目錄(用於分發)並從那裏運行,它就不起作用。

在後一種情況下,我得到了同樣的錯誤作爲你的第二個報價:

Failed to execute helper program (Invalid argument)

build目錄是不是在我的道路,並且也不是特別的任何其他原因(這是一個臨時RAM駕駛)。所以我完全感到困惑。

然後我想到了那個錯誤......它可能在談論什麼幫助程序?

爲什麼從build目錄運行時可以找到該程序?那麼,我的構建使用了一個包裝器,並且在路徑中放置了一些東西,所以我們不需要複製所有的DLL等來測試構建。

因此,我去調查是否有任何相關的東西 - 尋找MSYS2 shell和它的包裝器可能搜索的路徑。主要嫌犯當然是C:\msys64\mingw64\bin。再看看我在那裏發現:

gspawn-win64-helper-console.exe 

複製此可執行文件從我的應用程序的啓動目錄後,我的程序現在已經成功地啓動URI,無論哪個文件夾中的可執行文件目前居住在

。編輯

在MSYS2更新我的包後,又回到了同樣的錯誤 - 因爲它現在似乎是需要幫手:

gspawn-win64-helper.exe 

這實際上更有意義,因爲我的應用程序是圖形的,而不是控制檯。我想最近可能有些事情在這裏改變。您可以分發這兩個以保證安全。