如何在C++中将SHGetKnownFolderPath输出提供给CopyFile
How to feed SHGetKnownFolderPath output to CopyFile in C++?
我想通过SHGetKnownFolderPath
获得FOLDERID_ProgramFiles
,并通过以下代码将当前运行的文件复制到它:
char ModuleFileName[24];
GetModuleFileName(NULL, ModuleFileName, MAX_PATH) ;
PWSTR path = NULL;
SHGetKnownFolderPath(FOLDERID_ProgramFiles,0,NULL,&path);
CopyFile(ModuleFileName,path,FALSE);
但我没有锁,因为PWSTR
是wchar_t*
,CopyFile
需要const char*
,我试着把星号放在Path
之前,并使用wcstombs
函数进行转换,但没有锁!
我该怎么修?
PS:我有这个错误:
error: cannot convert ‘PWSTR {aka wchar_t*}’ to ‘LPCSTR {aka const char*}’ for argument ‘2’ to ‘WINBOOL CopyFileA(LPCSTR, LPCSTR, WINBOOL)’
我应该提到我使用的是Mingw g++
编译器,所以使用wprintf(L"%lsn",[STR] );
打印这些变量有点困难,而且我在输出中会得到很多坏字符。
使用API函数的*W变体(GetModuleFileNameW、CopyFileW等(,并在整个过程中使用wchar_t字符而不是字符。
您的另一种选择是从SHGetKnownFolderPath中获取返回的路径,并使用WideCharToMultiByte将路径转换为字符,但第一种方法更可取(例如,它不会对与用户区域设置匹配的字符进行dpend(。
您正在调用CopyFile()
的ANSI版本,并在第二个参数中向其传递Unicode字符串。这就是为什么你会得到一个编译器错误。请改用GetModuleFileName()
和CopyFile()
的Unicode版本。
此外,您的ModuleFileName
的大小只有24个char
s,但您告诉GetModuleFileNameW()
它的大小是MAX_PATH
(260(个字符。
此外,CopyFile()
需要文件路径,而不是文件夹路径。您需要从ModuleFileName
中提取文件名,并在将其传递给第二个参数时将其附加到path
的末尾。
试试类似的东西:
WCHAR ModuleFileName[MAX_PATH] = {};
GetModuleFileNameW(NULL, ModuleFileName, MAX_PATH);
PWSTR path = NULL;
SHGetKnownFolderPath(FOLDERID_ProgramFiles, 0, NULL, &path);
WCHAR NewFileName[MAX_PATH] = {};
PathCombineW(NewFileName, path, PathFindFileNameW(ModuleFileName));
CoTaskMemFree(path);
CopyFileW(ModuleFileName, NewFileName, FALSE);
PathCombine()
还有其他替代品,例如:
WCHAR NewFileName[PATHCCH_MAX_CCH] = {};
PathCchCombine(NewFileName, PATHCCH_MAX_CCH, path, PathFindFileNameW(ModuleFileName));
// use NewFileName as needed...
PWSTR NewFileName = NULL;
PathAllocCombine(path, PathFindFileNameW(ModuleFileName), 0, &NewFileName);
// use NewFileName as needed...
LocalFree(NewFileName);
#include <string>
std::wstring NewFileName(path);
if (NewFileName.back() != L'')
NewFileName += L'';
NewFileName += PathFindFileNameW(ModuleFileName);
// use NewFileName as needed...
#include <filesystem>
std::wstring NewFileName = (std::filesystem::path(path) / PathFindFileNameW(ModuleFileName)).wstring();
// use NewFileName as needed...
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 输出没有重复元素的动态数组(收缩数组)C++
- 如何在C++中将SHGetKnownFolderPath输出提供给CopyFile