2017-02-24 8 views
1

にglibの/ 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を」得ます。私がここで作るウリは間違っていますか?

私の第二のアプローチは、非同期コマンドラインでファイルを起動することでした。ここでは

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を表示しないと言うことはできません...しかし、2番目の問題については、私の答えを見てください。 'gspawn'ヘルパー実行ファイルをあなたのパスまたはあなた自身の実行可能ファイルと同じディレクトリに置く必要があると思います。確かに、それは私にとって同じ問題を解決しました。 –

答えて

0

私は同様の問題があったと私はそれを行うにはglibのを使用してあきらめなければならなかったとシンプルなクロスプラットフォーム(勝利、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

これはあなたのアプリケーションにシェルコード実行の脆弱性を( 'url'はエスケープされないから)導入し、**は使用しないでください**。一般に、 'system()'システムコールは絶対に避けてください。安全に簡単に使用できる一般的に適用可能な状況はほとんどありません。 –

0

うまくいけば、これは関連性があり、ちょうど(賢い!)回避策ではなく本当の答えを提供することができます。

私は奇妙な状況に遭遇しました:g_app_info_launch_default_for_uri()またはgtk_show_uri_on_window()でファイル(特にHTMLドキュメント)を起動すると、ビルドディレクトリから実行ファイルを実行したときに動作しました。しかし、exeを別のディレクトリ(配布用)にコピーしてそこから実行すると、動作しませんでした。後者の場合

が、私はあなたの第二の引用と同じエラーを得た:

Failed to execute helper program (Invalid argument)

(それは一時RAMでのビルドディレクトリには、私のパスではなく、またそれは、他の理由で特別ですドライブ)。だから私は完全に困惑した。

私はそのエラーについて考えました。どのようなヘルパープログラムが話すことができますか?

ビルドディレクトリから実行しているときに、なぜそのプログラムが見つかるのでしょうか?まあ、私のビルドはlibtoolラッパーを使用しています。これはパスにたくさんのものを入れます。そのため、ビルドをテストするだけですべてのDLLなどをコピーする必要はありません。

MSYS2シェルとそのlibtoolラッパーによって検索されるかもしれないパスに関連するものがあるかどうか調べました。主な容疑者はもちろん、C:\msys64\mingw64\binです。そして、私はそこに見つけたものを見て:

gspawn-win64-helper-console.exe 

私のアプリケーションが起動されたディレクトリにこの実行可能ファイルをコピーした後、私のプログラムは現在、正常にかかわらず、その実行ファイルが現在に存在するフォルダそのうち、URIを起動

を。 MSYS2に私のパッケージをアップデートした後

を編集し、それが同じエラーに戻っていた - それはは今、このが必要とされるヘルパーれるようだとして:

gspawn-win64-helper.exe 

私のアプリケーションはグラフィカルでコンソールではないので、実際にはそれが理にかなっています。最近ここで何か変わったと思うかもしれない。あなたは両方を配布して安全性を高めることができます。

関連する問題