如何在C++中为CopyFile提供SHIGET NoNoFoDePoad输出?
我想通过SHGetKnownFolderPath获取FOLDERID_程序文件,并通过以下代码将当前运行的文件复制到其中:如何在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
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,好的,让我看看我能做什么,再次感谢。