проверить свой путь
char* my_name = new char[200];
char* SysDir = new char[50];
GetSystemDirectory(SysDir,50);
strcat(SysDir,"\\test.exe");
GetModuleFileName(0,my_name,200);
//если мы не в системе, то перемещаемся туда
if (!strstr(my_name,SysDir))
{
MessageBox(0,"not in system",0,0);
if (!MoveFile(my_name,SysDir)) CopyFile(my_name,SysDir,FALSE);
WinExec(SysDir,SW_HIDE);
ExitProcess(0);
}
// все нормально, прога в system32
else MessageBox(0,"in system",0,0);
Но постояннно выскакивает окно, что прога не в системе, даже когда она запускается оттуда. Что не так?
С такой записью !strstr(my_name,SysDir) все время практически будет возвращаться истина (не ноль).
С такой записью !strstr(my_name,SysDir) все время практически будет возвращаться истина (не ноль).
Почему? Если в пути к моей проге присутствует WINDOWS\\SYSTEM32, то считается, что она запущена из системной папки.
А если не так, то как тогда?
В SysDir у тебя лежит имя программы с путем системной папки(хотя имя нехорошо присваивать так, вдруго оно изменилось?), во втором - реальное имя программы с реальным путем.
strstr, ищет вторую подстроку в первой.
Если находит - возвращает указательно на первое вхождение подстроки. Указатель это адресс, тоесть 4-х байтовое (в 32-х разрядной архитектуре) число. Применяя к нему отрицание (!) получаем другое число, причем ненулевое, если адресс не равен 1. А 1 он и не будет равен. Не нулевое число - это истина, значит код в if выполнится.
Если не находит - возвращает NULL, тоесть 0. применяя к нему отрицание (!) получаем еденицу, тоесть снова истину.
таким образом код в if будет выполняться всегда.
*a = 10;
int b = 3;
char* s= new char[3];
s = "ss\0";
cout<< !a <<endl <<!b <<endl <<s <<endl <<!s;
Ненулевое значение указателя интерпретируется как истина
А это код ничего обратного не демонстрирует )
The GetCurrentDirectory function retrieves the current directory for the current process.
DWORD GetCurrentDirectory(
DWORD nBufferLength, // size, in characters, of directory buffer
LPTSTR lpBuffer // address of buffer for current directory
);
В SysDir у тебя лежит имя программы с путем системной папки(хотя имя нехорошо присваивать так, вдруго оно изменилось?), во втором - реальное имя программы с реальным путем.
Наоборот, в первом параметре реальное имя проги.
....Указатель это адресс, то есть 4-х байтовое (в 32-х разрядной архитектуре) число. Применяя к нему отрицание (!) получаем другое число, причем ненулевое, если адресс не равен 1.
Демонстрирую то, что было при трассировке
s = 0x0041975c"ss" // s типа char*
!s = 0;
a = 0x00876370 // a типа int
!a = 0
Об этом я тебе и говорю - ненулувой указатель - значит истина, применяя отрицание получаем ложь, тобишь ноль.
И самый главный вопрос - как надо сделать ПРАВИЛЬНО??
P S aks даже если написать if (strstr(my_name, SysDir)==NULL) - все равно ничего не получается
Один фиг.
Дело как оказалось в другом.
GetSystemDirectory возвращает строку C:\WINDOWS\SYSTEM32, тогда как у моей проги путь (если она уже в системной папке) путь C:\WINDOWS\system32, т е различие в регистре system32.
Всем спасибо