2016-04-03 13 views
0

この関数システム内で "query user"ユーザ」)いくつかのdos comandsを発行してSystem()を使用する:: QUERY.EXEが内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されない

int main() 
    { 
     system("query.exe user"); 
     system("c:\\windows\\system32\\query.exe"); 
     return 0; 
    } 

が、結果は次のとおり query.exeは、内部または外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。

答えて

2

64ビットWindowsには、64ビットバージョンのquery.exeしかないので、64ビットバージョンのコマンドインタープリタからのみ動作するように見えます。おそらくあなたのプログラムは32ビットアプリケーションとして構築されていると思われます。

最高の解決策は、可能であれば、まったく外に出てはならず、対応するAPIを直接使用することです。外部プログラムへのシェルリングは、UNIXでは一般的な方法ですが、Windowsではお勧めしません。

しかし、これは不可能な場合:

あなたが唯一、64ビットシステム上で実行する64ビットになるようにアプリケーションを変更する必要がある場合。

64ビットシステムと32ビットシステムの両方で実行する必要がある場合は、実行中のソートを把握し、実行時にそれに応じて動作する必要があります。これを行うには、IsWow64Process()API関数を使用します。

32ビット版のWindows(またはアプリケーションが64ビット版)の場合、質問で使用したコマンドは現状どおりに動作するはずです。あなたは、64ビットのWindows上で動作する32ビットアプリケーションをしている場合は、のようなもののように変更します。プロダクションコードで

system("c:\\windows\\sysnative\\query.exe user"); 

、あなたが使用して、例えば、実行時にWindowsディレクトリの場所を調べる必要がありますGetWindowsDirectory()API関数です。

+0

Harryさん、ありがとう、私はc:\ windows \ system32から私のアプリケーションフォルダにquery.exeをコピーしようとしました。 – eyyah

+1

あなたのコードが自分のシステムでのみ実行されるのなら、それは妥当な回避策です。私は第三者のシステムにとってそれが賢明だろうとは確信していません。 –

+0

@eyyahはい、それは間違いなく解決策です。あなたは何をしていてもAPIを使わないのはなぜですか? –

1

一部のコマンドは、コマンドインタープリタによって内部的に実装され、別々の実行可能ファイルでは実装されません。このようなコマンドの場合、適切な引数を指定してインタプリタを実行する必要があります。例えば、

cmd /c query user 

他のコマンドは実行可能ファイルとして実装されています。この場合、systemが見つかります。実行ファイルが見つからない場合は、存在しないか、間違った場所で検索しています。

コマンドがどのように実装されているか、実行可能ファイルがどこにあるかを調べる必要があります。

外部プロセスにシェルするのではなく、適切なAPIを使用して必要な情報を取得するのが慣習的です。

+0

デイヴィッド、私は試しました システム( "cmd/cクエリユーザー"); でも同じ結果です:内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません – eyyah

+0

おそらくターゲットシステム上にこのようなコマンドはありません。おそらく、あなたのシステムについて何らかの調査を行う必要があります。 –

+0

しかし、cmd.exeを開いたときにコマンド "query user"を実行すると、完全な情報が得られます – eyyah

0

このような単純なクエリでは、私はsystemコールを使用することはなく、さらに新しいCreateProcessShellExecute[Ex]を使用します。代わりに私は同じのために直接Win32 APIを使用します。たとえば、現在のユーザー名を検索する場合はGetUserNameとなります。

外部プログラムを呼び出す代わりに適切なAPIを検索して、プログラミング、適切な制御、セキュリティ、速度を容易にしてください。いつでもAPIを検索することができます。 依存関係ウォーカーを使用して、Windowsコマンドで使用される関数/ DLLを見つけることができます。たとえば、Query.EXEをDependsで開き、参照されている関数を見つけます。

関連する問題