所以我试图用code::blocks
在c ++中创建一个自我复制的.exe。我已经编写了代码,在我的本地机器上它完美无缺。在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文件,但事实并非如此,我觉得这是一个权限问题,但我可能是错的。
欢迎任何关于自我复制的提示,我对新方法持开放态度。
答案 0 :(得分:1)
请注意,Windows Vista和Windows 7启用了UAC,但不允许您“写入”某些文件夹。您可能必须以管理员模式运行程序或完全禁用UAC,以便程序将文件从一个位置复制/创建到受保护的特殊文件夹。
要请求用户允许程序以管理模式运行,您必须定义清单文件并将其链接到您的应用程序:这将告诉您如何执行该操作。