1

次のコードがACプログラムから実行されたときに、「'bcdedit'は内部コマンドまたは外部コマンドではありません」を返す理由がわかりません。bcdeditはcmd行で完全に正常に動作します。どうすればこれを機能させることができますか?

#include <stdio.h>

int main ()
{
    system("bcdedit");
    system("TIMEOUT /T 3");
    return(0);
}
4

3 に答える 3

2

これは、Command Prompt[スタート] メニューまたは [実行] ウィンドウから実行すると、cmdにある 64 ビット バージョンが実行されますが、C プログラムから呼び出すと、 にある 32 ビットC:\Windows\System32\cmd.exeバージョンが呼び出されるために発生します。これは、C コンパイラが 32 ビット アプリケーションを生成するために発生します。cmdcmdC:\Windows\SySWOW64\cmd.exe

MSDNによると:

%windir%\System32 ディレクトリは、64 ビット アプリケーション用に予約されています。ほとんどの DLL ファイル名は、64 ビット バージョンの DLL が作成されたときに変更されていないため、32 ビット バージョンの DLL は別のディレクトリに格納されます。WOW64 は、ファイル システム リダイレクタを使用してこの違いを隠します。

ほとんどの場合、32 ビット アプリケーションが %windir%\System32 にアクセスしようとすると、アクセスは %windir%\SysWOW64 にリダイレクトされます。

ソース: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384187%28v=vs.85%29.aspx

両方を比較cmdすると、それらが同一であることがわかります。異なるのは dll です。

問題は、Windows x64 がフォルダーに 64 ビットbcdedit.exeを提供するが、どこにもSystem3232 ビットを提供しないことです。そのため、32 ビットは 64 ビットを実行できないため、このコマンドが無効であることを返します。bcdedit.execmdbcdedit

解決策: Windows x86 バージョンから32 ビットを入手することもbcdedit、64 ビット アプリケーションをコンパイルすることもできます。

于 2013-07-25T12:58:25.960 に答える
1

実行可能ファイルが見つからないことが原因である可能性があります。パスが正しいことを確認するか(a)、フルパス名を使用します。

system ("c:\\windows\\system32\\bcdedit.exe");

そしてもちろん、これは言うまでもありません。管理ユーザーとして実行するようにしてください。


(a)次のような方法でこれを確認できるはずです。

system ("path");
于 2012-05-31T04:52:57.990 に答える
0

1つのコマンドを2つの部分に分割したと思います。また、「bcdedit.exe / timeout 3」を実行したいと思いますが、システムコマンドの引数を2つの部分に分けます。1つは「bcedit.exe」、もう1つは「 / timeout3"。私はあなたがこれを書くべきだと思います

system("bcdedit.exe /timeout 3");

必要なコマンドを実行します。これがお役に立てば幸いです。

于 2012-05-31T12:42:32.280 に答える