2016-07-05 8 views
-1

最近、私はここでS.O.ファイルの実行後にファイルを削除するための解決方法があると主張し、そのためにいくつかのコードを提供しています。CからC++への変換を避ける<strsafe.h>

次に、C言語で書かれたstrsafe.hというライブラリを使用しました。これはVisualライブラリであり、C++では動作しない他のフォーラムでも読んでいます。

このコードをC++で使用するための実用的なソリューションはありますか?どんな助けもありがとう。

#include <Windows.h> 
#include <strsafe.h> 

#define SELF_REMOVE_STRING TEXT("cmd.exe /C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del \"%s\"") 

void DelMe() 
{ 
    TCHAR szModuleName[MAX_PATH]; 
    TCHAR szCmd[2 * MAX_PATH]; 
    STARTUPINFO si = {0}; 
    PROCESS_INFORMATION pi = {0}; 

    GetModuleFileName(NULL, szModuleName, MAX_PATH); 

    StringCbPrintf(szCmd, 2 * MAX_PATH, SELF_REMOVE_STRING, szModuleName); 

    CreateProcess(NULL, szCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi); 

    CloseHandle(pi.hThread); 
    CloseHandle(pi.hProcess); 
} 

void main() 
{ 
    /* Do what you need */ 

    /* Call this function at the very end of your program to delete itself */ 
    DelMe(); 
} 
+0

このコードは、WindowsであればC++でも正常に動作します。しかし、あなたが ''なしでそれをすることについて言及しなかったので、私はそれが問題ではないと仮定します。 –

+0

@BenjaminLindleyはい私はそれがWindowsのためのものだと知っていますが、strsafe.hのためにコンパイルできません。 –

+0

このコード(またはむしろ "such")のコード*は、*要求するページ*ディスク上のバイナリファイル。このようなシステムでは、プロセスがそこから実行されているときにファイルをロックする必要があります。なぜなら、アクセス可能な状態に保つ必要があり、後でページインするためにその完全性を確保するからです。 – tofro

答えて

0

ここ<strsafe.h>からの唯一の機能は、しかし、あなたが原因のWindowsネイティブ関数の、そう簡単に他のプラットフォームへの移植、それをすることはできませんあなたがwsprintf

//StringCbPrintf(szCmd, 2 * MAX_PATH, SELF_REMOVE_STRING, szModuleName); 
wsprintf(szCmd, SELF_REMOVE_STRING, szModuleName); 

に置き換えることができますStringCbPrintfです中古。

+0

TEXT()でファイル名を変更するなどの他のcmdコマンドを連結する方法はありますか? –

+0

@ J.Doe SELF_REMOVE_STRINGは書式文字列として使用されますので、別のパラメータを追加したい場合は、そこに '%s'やその他の書式指定子を使用するか、コマンドを追加してください。 – buld0zzr

+0

#define SELF_REMOVE_STRING TEXT(" cmd。 exe/C Del \ "%s \"&ren%cd%\ file1.txt newname.txt ")、動作しません。ファイルは削除され(最初のコマンドは正常に実行されますが)、2番目のコマンドは実行されないようです。 –