#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, но я их не помню 🙂