如何在C++中为CopyFile提供SHIGET NoNoFoDePoad输出?

如何在C++中为CopyFile提供SHIGET NoNoFoDePoad输出?,c++,winapi,casting,C++,Winapi,Casting,我想通过SHGetKnownFolderPath获取FOLDERID_程序文件,并通过以下代码将当前运行的文件复制到其中: char ModuleFileName[24]; GetModuleFileName(NULL, ModuleFileName, MAX_PATH) ; PWSTR path = NULL; SHGetKnownFolderPath(FOLDERID_ProgramFiles,0,NULL,&path); CopyFile(ModuleFileName,path

我想通过SHGetKnownFolderPath获取FOLDERID_程序文件,并通过以下代码将当前运行的文件复制到其中:

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*,我尝试将star放在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++编译器,所以使用wprintfL%ls\n,[STR]打印这些变量有点困难;我在输出中得到了很多坏字符。

使用API函数getModuleFileName、CopyFileW等的*W变体,并在整个过程中使用wchar\u t字符而不是char


您的另一种选择是从SHGetKnownFolderPath获取返回的路径,并使用WideChartMultiByte将路径转换为字符,但第一种方法更可取,例如,它不会在与用户区域设置匹配的字符上终止。

您调用的是ANSI版本的CopyFile,并在第二种方法中传递一个Unicode字符串参数这就是为什么会出现编译器错误。改用Unicode版本的GetModuleFileName和CopyFile

另外,您的ModuleFileName的大小只有24个字符,但您告诉GetModuleFileName它的最大路径大小是260个字符

此外,CopyFile需要的是文件路径,而不是文件夹路径。您需要从ModuleFileName中提取文件名,并在将其传递给第二个参数时将其附加到路径的末尾

尝试类似以下内容:

WCHAR ModuleFileName[MAX_PATH]={}; GetModuleFileName、ModuleFileName、最大路径; pwstrpath=NULL; SHGetKnownFolderPathFOLDERID\u程序文件,0,NULL,&path; WCHAR NewFileName[MAX_PATH]={}; PathCombinewFileName、path、PathFindFileNameModuleFileName; CoTaskMemFreepath; CopyFileWModuleFileName,NewFileName,FALSE; PathCombine还有其他替代方案,例如:

WCHAR NewFileName[pathch_MAX_CCH]={}; PathCchCombineNewFileName、PATHCCH_MAX_CCH、path、PathFindFileNameModuleFileName; //根据需要使用NewFileName。。。 PWSTR NewFileName=NULL; PathAllocCombinPath、PathFindFileNameModuleFileName、0和NewFileName; //根据需要使用NewFileName。。。 LocalFreeNewFileName; 包括 std::wstring NewFileNamepath; 如果NewFileName.back!=L'\\' NewFileName+=L'\\'; NewFileName+=PathFindFileNameModuleFileName; //根据需要使用NewFileName。。。 包括 std::wstring NewFileName=std::filesystem::pathpath/PathFindFileNameWModuleFileName.wstring; //根据需要使用NewFileName。。。
将CopyFile更改为CopyFileW有关说明,请参阅。建议您使用Unicode作为默认值谢谢,先生,我找不到pathcch.h链接器库,您知道我应该为这个库使用什么链接器吗__PathAllocCombine@16“@malloc,你需要Pathcch.lib。还有其他可用的路径组合函数pathchcombine,pathchappend,etcI,我以前读过,我在Mingw编译器的所有库中搜索该符号,但没有找到任何结果,没有库包含该符号。我想我应该换一下房间PathAllocCombine@malloc如果你的编译器有pathch.h,它也应该有pathch.lib。更糟糕的情况是,您总是可以直接从.dll生成一个新的.lib,或者使用GetProcAddress动态加载函数y如果它有pathch.h但没有pathch.lib,好的,让我看看我能做什么,再次感谢。