2012-10-18 17 views
1

所以我想在C++中使用code::blocks來創建一個自我複製的.exe。我已經編寫了代碼,並在我的本地機器上完美運行。在將其加載到Windows 7虛擬機和其他2臺PC上後,我意識到它不起作用。它與錯誤Cpp自我訪問被拒絕

出現「無法複製文件,訪問被拒絕」

我的電腦可能有不同的權限設置我假設這就是爲什麼它適用於礦山,而不是其他。下面是一段代碼:

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

說實話,這個問題看起來很可疑,而你長時間的java和c#開發人員的陳述值得懷疑。通常情況下,你會希望有一些歸檔文件被提取出來,然後執行一個包含文件,但是將它合併到一個程序中聽起來不太常見,我看不到它背後的推理。 – 2012-10-18 19:47:52

+0

我一直是一個專業的網絡應用工程師15年,超過15種不同的語言,這是我曾經問過的第一個問題,也是爲什麼它似乎可疑?它正在爲第三方apache控制器編寫,以便在服務器上的某些功能上保存日誌和時間。我希望它作爲一個獨立的EXE,因爲它聽起來很不尋常,它需要完成。 –

回答

1

請知道,Windows Vista和Windows 7啓用了UAC,不允許您「寫入」某些文件夾。您可能必須以管理員模式運行程序或完全禁用UAC,以便程序將文件從一個位置複製/創建到受保護的特殊文件夾。

要請求用戶允許程序在管理模式下運行,您必須定義清單文件並將其鏈接到您的應用程序:這會告訴您如何執行此操作。

+0

是的,這就是我認爲,在我的本地機器上,我禁用UAC,但在XP上,這是做同樣的事情,據我所知,沒有啓用UAC。我有一個解決辦法,但我喜歡弄清楚所以你有什麼辦法可以避免在Windows中的UAC?以管理員身份運行後,它就像一個魅力一樣。任何方式來騎這個?甚至提示用戶? –

+0

定義並鏈接您自己的清單文件。 http://www.codeproject.com/Articles/66259/Requesting-Admin-Approval-at-Application-Start檢查如何做。 –

+0

@evanhayes,我希望它有幫助。如果是這樣,選擇答案爲「正確」是感謝我的方式:-) –