Скопировать текущий исполняемый файл в другой путь C++ (только для Windows)

Я забыл, как программировать на С++, я хочу, чтобы мой исполняемый файл копировал себя по другому пути. Я нашел код, который делает то, что я хочу, но есть ошибка преобразования, которую я не знаю, как решить:

void Victim::replicate()
{
  char filename[ MAX_PATH ];
  char newLocation[] = "C:\\Users\\myUsername\\Desktop\\";
  BOOL stats=0;
  DWORD size = GetModuleFileNameA( NULL, filename, MAX_PATH );
  CopyFile(filename, newLocation, stats);
      
}

Я получил ошибку при использовании функции CopyFile, она ожидает тип LPCWSTR для имени файла и newLocation. Но если я объявлю эту переменную как LPCWSTR, функция GetModuleFileNameA больше не будет работать.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
422
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, ваш проект настроен на использование W версий функций API по умолчанию. Вы переопределяете это, вызывая A (Ansi) версию GetModuleFileName. Не - или делай, но тогда еще и звонить надо CopyFileA.

Принудительное использование версии Ansi:

void Victim::replicate()
{
  char filename[ MAX_PATH ];
  char newLocation[] = "C:\\Users\\myUsername\\Desktop\\";
  BOOL stats=0;
  DWORD size = GetModuleFileNameA( NULL, filename, MAX_PATH );
  CopyFileA(filename, newLocation, stats);     
}

Принудительное использование широкой версии:

void Victim::replicate()
{
  wchar_t filename[ MAX_PATH ];
  wchar_t newLocation[] = L"C:\\Users\\myUsername\\Desktop\\";
  BOOL stats=0;
  DWORD size = GetModuleFileNameW( NULL, filename, MAX_PATH );
  CopyFileW(filename, newLocation, stats);     
}

Переход с проектом по умолчанию:

void Victim::replicate()
{
  TCHAR filename[ MAX_PATH ];
  TCHAR newLocation[] = _T("C:\\Users\\myUsername\\Desktop\\");
  BOOL stats=0;
  DWORD size = GetModuleFileName( NULL, filename, MAX_PATH );
  CopyFile(filename, newLocation, stats);     
}

Спасибо, это работает, и теперь все ясно. Я должен ознакомиться со всеми этими типами

Sad1que 18.12.2020 17:33

@Flamecube667 Отлично! Пожалуйста! Что касается типов, я думаю, что нужно использовать макросы для char и wchar_t, чтобы они были должным образом Microsoftифицированы, но я их не помню :)

Ted Lyngmo 18.12.2020 17:35

Другие вопросы по теме