1

所以我试图在 C++ 中使用 .exe 创建一个自我复制的 .exe code::blocks。我已经编写了代码,并且在我的本地机器上它可以完美运行。在 Windows 7 虚拟机和其他 2 台 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 复制到 cdrive,运行复制的文件并关闭原始文件。这是我尝试的另一种方式

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 回答