C++ 从C转换为C++;避免<;strsafe.h>;

C++ 从C转换为C++;避免<;strsafe.h>;,c++,c,C++,C,最近我在S.O.上读到一篇文章,文章声称有一种解决方案,可以在文件执行后删除文件,并提供了一些代码 我发现它是用C编写的,使用了一个名为StruSuff.h的库,我在其他论坛中读过,它是一个可视化库,它在C++上没有用。 < C++中是否有使用此代码的工作解决方案?任何帮助都将不胜感激 #include <Windows.h> #include <strsafe.h> #define SELF_REMOVE_STRING TEXT("cmd.exe /C ping 1

最近我在S.O.上读到一篇文章,文章声称有一种解决方案,可以在文件执行后删除文件,并提供了一些代码

我发现它是用C编写的,使用了一个名为StruSuff.h的库,我在其他论坛中读过,它是一个可视化库,它在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();
}
#包括
#包括
#定义SELF\u REMOVE\u字符串文本(“cmd.exe/C ping 1.1.1-n1-w 3000>Nul&Del\%s\”)
void DelMe()
{
TCHAR szModuleName[最大路径];
TCHAR szCmd[2*最大路径];
STARTUPINFO si={0};
进程信息pi={0};
GetModuleFileName(NULL,szModuleName,MAX_路径);
StringCbPrintf(szCmd,2*MAX_路径,SELF_-REMOVE_字符串,szModuleName);
CreateProcess(NULL、szCmd、NULL、NULL、FALSE、CREATE_NO_窗口、NULL、NULL、si和pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
void main()
{
/*做你需要的*/
/*在程序的最后调用此函数以删除自身*/
德尔梅();
}

此处
中唯一的功能是
StringCbPrintf
,您可以将其替换为
wsprintf

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

但是,由于Windows的本地函数,所以不能很容易地将它移植到其他平台。

只要你在Windows上,这个代码在C++中就可以工作得很好。但是,既然你没有提到在没有
的情况下使用它,我想这不是问题。@BenjaminLindley是的,我知道它只适用于Windows,但我无法编译它,因为strsafe.hThis(或者更确切地说,“这样”)代码在需要从磁盘上的二进制文件中分页可执行文件的系统上无法正常工作。这样的系统需要在从那里执行进程时锁定文件,因为它需要保持可访问性,并为以后的page-ins.@J.Doe保护其完整性-以防您通过“strsafe.h”阶段,您将遇到更多的问题-大多数使用过的系统调用都不在非windows OSs的表单中。@J.Doe:您的错误是什么?这对我来说很好。有没有办法在TEXT()中连接其他cmd命令,例如重命名文件名?@J.Doe SELF_REMOVE_STRING用作格式字符串,因此如果要添加其他参数,请在其中使用
%s
或其他格式说明符,或者添加其他命令等。我尝试了定义SELF_REMOVE_STRING TEXT(“cmd.exe/C Del\”%s\“&ren%cd%\file1.txt newname.txt”),它不起作用。文件已被删除(第一个命令成功运行),但第二个命令似乎从未运行。@J.Doe这是一个格式字符串,
%
是一个特殊符号,您需要对其进行转义
\define SELF\u REMOVE\u string TEXT(“cmd.exe/C Del\%s\”&ren%%cd%%\file1.txt newname.txt)
仍然不起作用。我得到了和以前一样的结果。我不知道怎么了