Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проверить свой путь

4.1K
26 декабря 2006 года
GRIENDERS
117 / / 06.06.2006
Моя прога должна узнать, где она находится: если в system32, то она продолжает нормально работать, а если не в system32, то она должна переместится туда (либо скопироваться), запустить свою копию там, а сама завершиться. Вот кривой код
Код:
//переместимся в системную папку
    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);

Но постояннно выскакивает окно, что прога не в системе, даже когда она запускается оттуда. Что не так?
355
28 декабря 2006 года
<SCORP>
786 / / 21.10.2006
из того что первое приходит на ум -- в самом первом параметре командной строки передаётся путь, по которому данный исполняемый файл был запущен
240
29 декабря 2006 года
aks
2.5K / / 14.07.2006
GRIENDERS, блин почитай что делает функция strstr.
С такой записью !strstr(my_name,SysDir) все время практически будет возвращаться истина (не ноль).
4.1K
29 декабря 2006 года
GRIENDERS
117 / / 06.06.2006
Цитата: aks
GRIENDERS, блин почитай что делает функция strstr.
С такой записью !strstr(my_name,SysDir) все время практически будет возвращаться истина (не ноль).


Почему? Если в пути к моей проге присутствует WINDOWS\\SYSTEM32, то считается, что она запущена из системной папки.
А если не так, то как тогда?

240
29 декабря 2006 года
aks
2.5K / / 14.07.2006
Еще, раз. Посмотри что возвращает strstr!!!
В SysDir у тебя лежит имя программы с путем системной папки(хотя имя нехорошо присваивать так, вдруго оно изменилось?), во втором - реальное имя программы с реальным путем.
strstr, ищет вторую подстроку в первой.
Если находит - возвращает указательно на первое вхождение подстроки. Указатель это адресс, тоесть 4-х байтовое (в 32-х разрядной архитектуре) число. Применяя к нему отрицание (!) получаем другое число, причем ненулевое, если адресс не равен 1. А 1 он и не будет равен. Не нулевое число - это истина, значит код в if выполнится.
Если не находит - возвращает NULL, тоесть 0. применяя к нему отрицание (!) получаем еденицу, тоесть снова истину.
таким образом код в if будет выполняться всегда.
4.1K
29 декабря 2006 года
GRIENDERS
117 / / 06.06.2006
Дорогой мой, запусти вот такую программку и убедись в обратном
 
Код:
int *a = new int;
*a = 10;
int b = 3;
char* s= new char[3];
s = "ss\0";
cout<< !a <<endl <<!b <<endl <<s <<endl <<!s;

Ненулевое значение указателя интерпретируется как истина
240
02 января 2007 года
aks
2.5K / / 14.07.2006
Еще раз перечитай внимательно то, что я написал и вникни ))
А это код ничего обратного не демонстрирует )
1.8K
02 января 2007 года
Death Knight
139 / / 19.02.2006
может лучше воспользоваться функцией
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
);
4.1K
02 января 2007 года
GRIENDERS
117 / / 06.06.2006
Цитата: aks
Еще, раз. Посмотри что возвращает strstr!!!
В SysDir у тебя лежит имя программы с путем системной папки(хотя имя нехорошо присваивать так, вдруго оно изменилось?), во втором - реальное имя программы с реальным путем.


Наоборот, в первом параметре реальное имя проги.

Цитата: aks

....Указатель это адресс, то есть 4-х байтовое (в 32-х разрядной архитектуре) число. Применяя к нему отрицание (!) получаем другое число, причем ненулевое, если адресс не равен 1.


Демонстрирую то, что было при трассировке

s = 0x0041975c"ss" // s типа char*
!s = 0;
a = 0x00876370 // a типа int
!a = 0

Цитата: aks
Не нулевое число - это истина


Об этом я тебе и говорю - ненулувой указатель - значит истина, применяя отрицание получаем ложь, тобишь ноль.


И самый главный вопрос - как надо сделать ПРАВИЛЬНО??

P S aks даже если написать if (strstr(my_name, SysDir)==NULL) - все равно ничего не получается

398
02 января 2007 года
Alexandoros
630 / / 21.10.2005
strcmp
4.1K
02 января 2007 года
GRIENDERS
117 / / 06.06.2006
Цитата: Alexandoros
strcmp


Один фиг.
Дело как оказалось в другом.
GetSystemDirectory возвращает строку C:\WINDOWS\SYSTEM32, тогда как у моей проги путь (если она уже в системной папке) путь C:\WINDOWS\system32, т е различие в регистре system32.
Всем спасибо

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог