Вы вызываете версию ANSI CopyFile()
и передаете ей строку Unicode во втором параметре. Вот почему вы получаете ошибку компилятора. Вместо этого используйте Unicode-версию GetModuleFileName()
и CopyFile()
.
Кроме того, ваш ModuleFileName
имеет размер только 24 char
с, но вы говорите 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...