4

64 ビット コンピューターで実行しようとしている 32 ビット プログラムがあります。vssadmin コマンドを実行して復元ポイント情報を取得し、テキスト ファイルに保存しています。現在、私の 32 ビット コンピュータでは正常に動作し、友人の 64 ビット コンピュータでテストしていましたが、動作しません。

64 ビット システムで実行されている 32 ビット アプリケーション内から system() を使用すると、32 ビット コマンド プロンプトが使用されますか? コマンドプロンプトからコマンドを手動で実行したので、それが機能しなくなると私が考えることができる唯一のことであり、正常に動作します。

このような場合は?正しいコマンドプロンプトを使用するように強制する方法はありますか?

4

2 に答える 2

10

Linux と Windows の両方で [そして BSD/MacOS もそうだと思います]、32 ビット アプリケーションは、関連する「新しいプロセスを作成する」システム コールを使用して 64 ビット プロセスを開始できます [これsystem()は、起動するシェル内でいくつかのレイヤーを実行します。 ]。

唯一の制限は、32 ビットの実行可能ファイルが 64 ビットの共有ライブラリ (.so または .dll) を使用できないこと、またはその逆ができないことです。ただし、新しいプロセスは新しい実行可能ファイルをロードすることによって開始され、その時点で、プロセスは実行可能ファイル自体に基づいて 32 ビットまたは 64 ビットになる可能性があります。

于 2013-03-21T16:10:12.713 に答える
1

system() の使用は常に避けるべきです。

  • リソースが重い
  • それはセキュリティを打ち負かします-それが有効なコマンドであるか、すべてのシステムで同じことを行うかがわからない場合(Mats Peterssonの回答を参照)、起動するつもりのないプログラムを起動することさえできます。 危険なのは、プログラムを直接実行すると、そのプログラムが自分のプログラムと同じ権限を取得することです。つまり、たとえば、システム管理者として実行している場合、うっかり実行してしまった悪意のあるプログラムもシステム管理者として実行されてしまうということです。それでも怖くない場合は、脈拍をチェックしてください。
  • ウイルス対策プログラムはそれを嫌います。プログラムがウイルスとしてフラグを立てられる可能性があります。

CreateProcess()を使用する必要があります。

Createprocess() を使用して、.exe を起動し、新しいプロセスを作成することができます。アプリケーションは、呼び出し元のアプリケーションから独立して実行されます。

私のプロジェクトの1つで使用した例を次に示します。

VOID startup(LPCTSTR lpApplicationName)
{
   // additional information
   STARTUPINFO si;     
   PROCESS_INFORMATION pi;

   // set the size of the structures
   ZeroMemory( &si, sizeof(si) );
   si.cb = sizeof(si);
   ZeroMemory( &pi, sizeof(pi) );

  // start the program up
  CreateProcess( lpApplicationName,   // the path
    argv[1],        // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    0,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

注: 前に述べたように、system() は異なるマシンでは同じことを行いません。Mats Petersson はその理由を説明しました

于 2013-03-21T17:17:00.013 に答える