1

だから私は .exe を使用して c++ で自己複製する .exe を作成しようとしていますcode::blocks。コードを書きましたが、ローカル マシンでは問題なく動作します。Windows 7 仮想マシンと他の 2 台の PC にロードした後、動作しないことに気付きました。エラーが発生します

「ファイルをコピーできません。アクセスが拒否されました」

私のPCにはおそらく異なるアクセス許可が設定されていると思われます。コードのセクションは次のとおりです。

ifstream check( "C:\\newfile.exe" );

if( !check.is_open() )
{
    char bufferf[MAX_PATH];
    GetModuleFileName( NULL, bufferf, MAX_PATH );
    std::stringstream str;

    str << "copy " << bufferf << " C:\\newfile.exe";
    system( str.str().c_str() );
    system( "start c:\\newfile.exe" );
    cout << __argv[0] << endl;
    return 1;
}
else
{
    return 0;

}

私は c++ に非常に慣れていないことを覚えておいてください。Java、php、および c# の長年の開発者ですが、低レベルの言語を学ぶ時が来たと考えました。これをより効率的な関数にするための提案があれば、私に知らせてください。私はまだすべてのライブラリに 100% 精通しているわけではないので、できるコードを示してください。簡単に言うと、現在のexeをcドライブにコピーし、コピーしたファイルを実行して元のファイルを閉じたいと思います。ここに私が試した別の方法があります

ifstream check( "C:\\newFile.exe" );

if( !check.is_open() )
{
    char bufferf[MAX_PATH];
    GetModuleFileName( NULL, bufferf, MAX_PATH );

    char * original_file = bufferf;
    char * new_file = ( char * )"c:\\newFile.exe";
    ( void ) CopyFile( ( LPCTSTR )original_file, ( LPCTSTR )new_file, FALSE );
    system( "start c:\\newFile.exe" );
    cout << __argv[0];
    return 1;
}
else
{
    return 0;
}

まだ成功していません。しかし、どちらも私の開発マシンで問題なく動作します (私が見る限り) Windows で実行中の exe ファイルをコピーできないと言う人がいると聞きましたが、それは真実ではありません。権限の問題だと思いますが、間違っている可能性があります。

自己複製に関するヒントは大歓迎です。私は新しい方法を受け入れます。

4

1 に答える 1

1

Windows Vista と Windows 7 では UAC が有効になっているため、特定のフォルダーへの「書き込み」が許可されていないことに注意してください。プログラムを管理者モードで実行するか、UAC を完全に無効にして、ある場所から保護された特別なフォルダーにファイルをコピー/作成する必要がある場合があります。

プログラムを管理モードで実行できるようにユーザーに要求するには、マニフェスト ファイルを定義してアプリケーションにリンクする必要があります。

于 2012-10-18T19:44:18.637 に答える