1

私は、最終的に同じコンピューター上にある別の既存の .exe を起動する必要がある Windows 用のプログラムを作成しています。複数のパラメーターをこの .exe ファイルに渡します。実際のコマンドとパラメーターを読み取ってコマンドを構築していますが、同じ結果でハードコーディングも試みました。ハードコーディングされたバージョンは次のとおりです(same.exeを使用する古いCプログラムからこれを選択しました):

system("c://IQapture//dmon2_6_IHD -p2 c://IQapture//mon_table_101_Tx8.txt 11 0 0");

そのため、元のプログラム内でint _cdecl main(int argc, char**argv)このシステムの使用は機能します。C++ クラス メソッド内の C++ プログラムでは、コマンドを発行すると正しいプログラムが起動しますが、エラーが発生したことを示すエラー ダイアログがすぐに表示されます。exeをコンソールに起動するために使用されるシステム文字列をエコーし​​ました。失敗した直後に、エコーされたのと同じ行をコピーして貼り付け、今度は exe がエラーなしで実行されます。これは繰り返し可能です。タイミング関連の場合は、システム コマンドを発行する前に 10 秒の遅延を追加しようとしましたが、問題はありませんでした。さらに、元の古いプログラムは遅延を必要としません。これは、文字列が正しく、ターゲット プログラムが動作することを意味します。どういうわけか、system() の呼び出しは、直接のコマンド ラインの呼び出しとは異なります。プログラムは正常にコンパイルおよびビルドされます。Visual Studio 2010 を使用しています。

system() の呼び出しをコマンド ラインの呼び出しのように機能させる方法についてアイデアを持っている人はいますか?

4

3 に答える 3

3

これは、Windows が満足するようなものではないように見えます。代わりに、バックスラッシュを使用してみてください。

system("c:\\IQapture\\dmon2_6_IHD -p2 c:\\IQapture\\mon_table_101_Tx8.txt 11 0 0");

それでも問題が解決しない場合は、次のいずれかの問題が発生している可能性があります。

  • 現在の作業ディレクトリが間違っています。
  • 環境変数がありません。
  • プログラムが間違ったユーザー権限で実行されています。
  • プログラムは、生成されたプロセスが必要とするリソースを拘束しています (たとえば、入力として必要なファイルを閉じていません)。
于 2013-01-29T02:19:04.503 に答える
2

環境、プログラムを実行しているユーザー、親プロセス、および継承されるものなど、考慮すべきことがたくさんあります... CreateProcess関数のパラメーターを見てください。システム コールの呼び出しがコマンド ラインの呼び出しと一致していない可能性があります (それは問題ではないかもしれませんが、より単純なものである可能性が高くなります)。

作成フラグやセキュリティ属性などを詳しく調べる前に、エラーからさかのぼって環境や現在のディレクトリなどの単純な原因を除外することをお勧めします。

于 2013-01-29T02:16:07.757 に答える
1

スラッシュが逆になっています。試す:

system("c:/IQapture/dmon2_6_IHD -p2 c:/IQapture/mon_table_101_Tx8.txt 11 0 0");

バックスラッシュを使用できます\が、これは文字列のエスケープ シーケンスのスターターであるため (C/C++ の場合)、2 つ続けて使用する理由です。コンパイラが\\文字列内の単一のスラーに変換するため:

したがって:

system("c:\\IQapture\\dmon2_6_IHD -p2 c:\\IQapture\\mon_table_101_Tx8.txt 11 0 0");

// Is equivelent to the command line string:

> c:\IQapture\dmon2_6_IHD -p2 c:\IQapture\mon_table_101_Tx8.txt 11 0 0

しかし、Windows は、私が覚えているよりも長い間、両方のタイプのスラッシュをサポートしてきました。したがって、次のコマンド ラインは同等です。

> c:/IQapture/dmon2_6_IHD -p2 c:/IQapture/mon_table_101_Tx8.txt 11 0 0

文字列 (C/C++) で「/」を使用する場合、エスケープは必要ありません。したがって、そのまま使用する必要があります。

system("c:/IQapture/dmon2_6_IHD -p2 c:/IQapture/mon_table_101_Tx8.txt 11 0 0");
于 2013-01-29T03:28:25.940 に答える