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

#c #copy #getmodulefilename

#c #Копировать #getmodulefilename

Вопрос:

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

 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 для filename и newLocation, но если я объявлю эти переменные как LPCWSTR, функция GetModuleFileNameA больше не будет работать.

Ответ №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);     
}
 

Комментарии:

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

2. @Flamecube667 Отлично! Добро пожаловать! Что касается типов, я думаю, что следует использовать макросы для char и wchar_t тоже, чтобы быть должным образом защищенным от Microsoft, но я их не помню 🙂