SHFILEOPSTRUCT不确定如何双转义字符串

SHFILEOPSTRUCT not sure how to double escape strings

本文关键字:转义字符 字符串 转义 何双 不确定 SHFILEOPSTRUCT      更新时间:2023-10-16

我正试图将正在运行的可执行文件复制到特定文件夹。我想用相同的安全资源属性复制它。但是,我不确定我是否像本文档

中描述的那样正确地"双重转义"文件名。我的代码如下:
#include <shlobj.h>
#include <shellapi.h>
#define LIVE_FOLDER "Cloud9"
bool CopySelf()
{
  TCHAR buf[MAX_PATH];
  TCHAR path[MAX_PATH];
  TCHAR ogpath[MAX_PATH];
  // The function gets the current module for you.
  SHGetFolderPath(NULL,CSIDL_APPDATA, NULL, 0, path);

  GetCurrentDirectory(MAX_PATH, ogpath);
  std::string dir =  std::string(path)+"\"+LIVE_FOLDER ;
  std::string dirog = std::string(ogpath);
  if(dir==dirog)
  {
    return false;
  }
  if (CreateDirectory(dir.c_str(), NULL) ||
        ERROR_ALREADY_EXISTS == GetLastError())
  {
        std::string newprocessName = dir + "\test.exe";
        GetModuleFileName(0, buf, MAX_PATH);
        std::string oldprocessName = std::string(buf)+"";
        SHFILEOPSTRUCT a=
        {
            NULL,
            FO_COPY,
            oldprocessName.c_str(),
            newprocessName.c_str(),
            FOF_SILENT|FOF_NOERRORUI|FOF_NOCONFIRMATION,
            FALSE,
            NULL,
            NULL,
        };

        SHFileOperation(&a);
        return true;
  }
  else
  {
      throw ERROR;
   // return false;
  }
  return false;
}

当我运行这段代码时,在目标处不是一个可执行文件,而是一个名为"test.exe"的文件夹。图像在这里-没有足够的点来嵌入它。

如果我在下面的代码中使用CopyFile或CopyFileEx,文件将被正确复制。

std::string newprocessName = dir + "\test.exe";
GetModuleFileName(0, buf, MAX_PATH);
CopyFile(buf, newprocessName.c_str(), TRUE);

这样做的问题是没有复制安全属性。在这一点上,我不确定我是否失败了"双转义"/"双null终止"或者我做了其他错误的事情。为什么要创建一个名为"test.exe"的文件夹,而不是复制文件?

我正在使用Code::Blocks with GCC编译器,我已经在Windows 8.1 Professional和Windows 7 Professional上尝试过了。

终于想通了。问题确实在于双空终止

我使用如下所示的append添加了一个空结束符,并且在声明字符串时使用了一个空结束符:

std::string newprocessName = dir + "\test.exe";
GetModuleFileName(0, buf, MAX_PATH);
std::string oldprocessName = std::string(buf)+"";
newprocessName.append(1, '');
oldprocessName.append(1, '');

不知道这有什么不同,但它现在工作了。