0

メインプロセスとは別に、Firefox で PDF を開く関数を作成しようとしています。createProcess のパラメーターに問題があると思います...どんな助けも大歓迎です

編集:バッチファイルが作成されています。何度かテストしましたが、少し説明します:バッチファイルは、自分が何をしているのか本当にわからないためです。私はコンピューターサイエンスの学生であり、これは側面です私の仕事で私を助けるためのプロジェクト。私は法律事務所で働いており、メールが届くと電子的にファイリングします。scans ディレクトリをループしてスキャンを表示し、ユーザーにドキュメントに関する情報を求める単純なプログラムを作成したいと考えました。したがって、ファイル パスを動的に構築できる必要があります。もともと「システム」を使ってFirefoxを開いてドキュメントを表示していました。少し試した後、バッチファイルで動作するようになりました。次に、システムがブロック コマンドであり、別のスレッドを開始する必要があることを知りました。ここで createprocess に遭遇しました。

void openPDF(char scansQueue[][MAX_NAME], int index)
{
// build bat file
fstream outfile;
outfile.open("C:\\firefox.bat");    
if(outfile.good())cout<<"outfile good!!!!"<<endl;
outfile<<"\"C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe\" \"C:\\Scans\\"   <<scansQueue[index]<<"\"";

STARTUPINFOW si; 
PROCESS_INFORMATION pi; 
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if(!CreateProcess(NULL, L"C:\\firefox", NULL, NULL, false, 0, NULL, NULL, &si, &pi))cout<<"PROCESS FAILED TO EXECUTE!!!";
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

}
4

1 に答える 1

2

このコードにはいくつかの問題があります。いくつかは既にコメントで指摘されています (失敗時に潜在的に無効なハンドルを閉じる、バッチ ファイルを作成できない可能性、およびかなり疑わしいコマンド ライン)。さらにいくつかの問題があります。

まず、この方法ではバッチ ファイルを実行できません。

ドキュメントCreateProcessには、次のように明確に記載されています。

バッチ ファイルを実行するには、コマンド インタープリターを起動する必要があります。lpApplicationNameを cmd.exe に設定し、 lpCommandLineを次の引数に設定します: /c とバッチ ファイルの名前。

lpCommandLine次に、ドキュメントで明示的に禁止されている の文字列リテラルを渡しています。

lpCommandLine [イン、アウト、オプション]

...

この関数の Unicode バージョンであるCreateProcessWは、この文字列の内容を変更できます。したがって、このパラメーターを読み取り専用メモリー ( const変数やリテラル文字列など) へのポインターにすることはできません。このパラメータが定数文字列の場合、関数によってアクセス違反が発生する可能性があります。

最後に、単一のコマンドを実行するために一時バッチ ファイルを作成するのはなぜですか? CreateProcessFirefox を直接起動する呼び出しを簡単に作成できます。

于 2013-09-14T07:53:20.087 に答える