SHFILEOPSTRUCT不确定如何双转义字符串
SHFILEOPSTRUCT not sure how to double escape strings
我正试图将正在运行的可执行文件复制到特定文件夹。我想用相同的安全资源属性复制它。但是,我不确定我是否像本文档
中描述的那样正确地"双重转义"文件名。我的代码如下:#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, ' ');
不知道这有什么不同,但它现在工作了。
相关文章:
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 将 NULL 与 C 的字符* 字符串一起使用
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 无法将常量字符字符串传递给模板类
- 为什么当我从 cin 阅读时转义字符不起作用?
- 如何组合一个宽字符字符串,中间插入一些空字符
- 转义std::字符串中的特殊字符
- 在QLineEdit中显示和编辑转义字符
- std::regex_error语言 - 意外的转义字符
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 从给定索引返回子字符字符串的函数
- 字符 [](c 字符串)的初始化标准
- LPCWSTR 查找和替换为转义字符
- 将带有转义字符的大字符串转换为字节数组
- 由转义字符组成的字符串文字的大小
- 在字符串行中查找转义字符
- 定义 std::字符串 C++不带转义字符
- 打印不带转义字符的字符串
- 在.pro文件QT中定义带有转义字符的字符串宏
- 在c++字符串字面量中使用的可接受的自定义转义字符是什么?