Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Нужен совет по структуре приложения

-

Вопросы и ответы, обсуждения

- Ваши вопросы по C# только в данном разделе

Ответ
 
Опции темы
Старый 15.03.2017, 16:38   #1
 Разведчик
Аватар для KLAIDY
 
KLAIDY никому не известный тип
Регистрация: 11.10.2010
Сообщений: 13
Популярность: 10
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 5 сообщениях
 
Question Нужен совет по структуре приложения

Привет, форумчане .
У меня возник следующий вопрос, нужен совет опытных людей.
Пишу приложение, внедряющееся в процесс (короче ингейм бота). Имеется основной класс My_Window. Для каждого отдельно запущенного клиента создается свой экземпляр класса.
Я заметил в чужих исходниках и вырезках кода, что многие люди открывают процесс, считывают инфу для подобного основного класса и не закрывают хэндл (точнее закрывают, то только в деструкторе). Я же перед каждым блоком операций чтения/записи в клиент открываю процесс и закрываю его в конце этого блока.
Для большего понимания того, о чем я говорю, вот часть конструктора основного класса.
Код:
//конструктор
        public My_Windows(IntPtr handle)
        {
            this.handle = handle;
            //получаем id процесса по хендлу
            WinApi.GetWindowThreadProcessId(handle, out processID);
            //запускаем процесс и получаем его дескриптор
            openedProcessHandle = WinApi.OpenProcess(WinApi.ProcessAccessFlags.All, false, ProcessID);
            //создаем экземпляр класса для отправки пакетов
            packetSend = new Packets(processID);
            //получаем имя персонажа для данного клиента
            name = CalcMethods.ReadString(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsName);
            //узнаем wid
            wid = CalcMethods.ReadInt(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsWid);
            //узнаем класс нашего персонажа
            classID = CalcMethods.ReadInt(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsClassId);
            //узнаем координаты
            x = CalcMethods.ReadFloat(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsX) / 10 + 400;
            y = CalcMethods.ReadFloat(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsY) / 10 + 550;
            z = CalcMethods.ReadFloat(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsZ) / 10;
            //выбираем картинку для нашего персонажа
            Select_Image(classID);
            //указываем состояние
            stateThread = StateEnum.stop;
            //создаем поток для окна
            this.BackgroundWorker5 = new BackgroundWorker();
            this.BackgroundWorker5.WorkerSupportsCancellation = true;
            this.BackgroundWorker5.DoWork += new DoWorkEventHandler(this.backgroundWorker5_DoWork);
            //закрываем дескриптор
            WinApi.CloseHandle(openedProcessHandle);
        }
И вот для примера один из методов для поиска ID NPC по имени
Код:
public static int MobSearch(int processID, string name)
        {
            IntPtr oph = WinApi.OpenProcess(WinApi.ProcessAccessFlags.All, false, processID);
            var mob = CalcInt32Value(oph, Offsets.BaseAdress);
            mob = CalcInt32Value(oph, mob + 0x1c);
            mob = CalcInt32Value(oph, mob + 0x1c);
            mob = CalcInt32Value(oph, mob + 0x20);
            int count = CalcInt32Value(oph, mob + 0x18);
            mob = CalcInt32Value(oph, mob + 0x5c);
            for (int ii = 0; ii < count; ii++)
            {
                var mob_2 = CalcInt32Value(oph, mob + ii * 0x4);
                int mob_wid = CalcInt32Value(oph, mob_2 + 0x114);
                mob_2 = CalcInt32Value(oph, mob_2 + 0x260);
                string mob_name = CalcStringValue(oph, mob_2 + 0x0);
                if (mob_name.Length > 0)
                {  
                    //если имя моба/NPC/пета совпадает с заданным, возвращает его id
                    if (mob_name.IndexOf(name) != -1)
                        return mob_wid;
                }
                

            }
            WinApi.CloseHandle(oph);
            return 0;
        }
Так вот. У меня вопрос к опытным людям. С точки зрения открытия/закрытия процесса как лучше поступать? Открыть раз и не париться или все таки лучше открывать/закрывать процесс по необходимости?
Забыл дописать, что использую С#.

Последний раз редактировалось KLAIDY; 15.03.2017 в 16:46.
  Ответить с цитированием
Старый 18.03.2017, 20:49   #2
Читер-спонсор
 Рыцарь-защитник
Аватар для Nickitee
 
Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(
Регистрация: 28.08.2009
Сообщений: 603
Популярность: 19129
Золото Zhyk.Ru: 500
Сказал(а) спасибо: 84
Поблагодарили 602 раз(а) в 321 сообщениях
 
По умолчанию Re: Нужен совет по структуре приложения

Цитата:
Сообщение от KLAIDYПосмотреть сообщение
Привет, форумчане .
У меня возник следующий вопрос, нужен совет опытных людей.
Пишу приложение, внедряющееся в процесс (короче ингейм бота). Имеется основной класс My_Window. Для каждого отдельно запущенного клиента создается свой экземпляр класса.
Я заметил в чужих исходниках и вырезках кода, что многие люди открывают процесс, считывают инфу для подобного основного класса и не закрывают хэндл (точнее закрывают, то только в деструкторе). Я же перед каждым блоком операций чтения/записи в клиент открываю процесс и закрываю его в конце этого блока.
Для большего понимания того, о чем я говорю, вот часть конструктора основного класса.
Код:
//конструктор
        public My_Windows(IntPtr handle)
        {
            this.handle = handle;
            //получаем id процесса по хендлу
            WinApi.GetWindowThreadProcessId(handle, out processID);
            //запускаем процесс и получаем его дескриптор
            openedProcessHandle = WinApi.OpenProcess(WinApi.ProcessAccessFlags.All, false, ProcessID);
            //создаем экземпляр класса для отправки пакетов
            packetSend = new Packets(processID);
            //получаем имя персонажа для данного клиента
            name = CalcMethods.ReadString(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsName);
            //узнаем wid
            wid = CalcMethods.ReadInt(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsWid);
            //узнаем класс нашего персонажа
            classID = CalcMethods.ReadInt(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsClassId);
            //узнаем координаты
            x = CalcMethods.ReadFloat(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsX) / 10 + 400;
            y = CalcMethods.ReadFloat(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsY) / 10 + 550;
            z = CalcMethods.ReadFloat(openedProcessHandle, Offsets.BaseAdress, Offsets.OffsetsZ) / 10;
            //выбираем картинку для нашего персонажа
            Select_Image(classID);
            //указываем состояние
            stateThread = StateEnum.stop;
            //создаем поток для окна
            this.BackgroundWorker5 = new BackgroundWorker();
            this.BackgroundWorker5.WorkerSupportsCancellation = true;
            this.BackgroundWorker5.DoWork += new DoWorkEventHandler(this.backgroundWorker5_DoWork);
            //закрываем дескриптор
            WinApi.CloseHandle(openedProcessHandle);
        }
И вот для примера один из методов для поиска ID NPC по имени
Код:
public static int MobSearch(int processID, string name)
        {
            IntPtr oph = WinApi.OpenProcess(WinApi.ProcessAccessFlags.All, false, processID);
            var mob = CalcInt32Value(oph, Offsets.BaseAdress);
            mob = CalcInt32Value(oph, mob + 0x1c);
            mob = CalcInt32Value(oph, mob + 0x1c);
            mob = CalcInt32Value(oph, mob + 0x20);
            int count = CalcInt32Value(oph, mob + 0x18);
            mob = CalcInt32Value(oph, mob + 0x5c);
            for (int ii = 0; ii < count; ii++)
            {
                var mob_2 = CalcInt32Value(oph, mob + ii * 0x4);
                int mob_wid = CalcInt32Value(oph, mob_2 + 0x114);
                mob_2 = CalcInt32Value(oph, mob_2 + 0x260);
                string mob_name = CalcStringValue(oph, mob_2 + 0x0);
                if (mob_name.Length > 0)
                {  
                    //если имя моба/NPC/пета совпадает с заданным, возвращает его id
                    if (mob_name.IndexOf(name) != -1)
                        return mob_wid;
                }
                

            }
            WinApi.CloseHandle(oph);
            return 0;
        }
Так вот. У меня вопрос к опытным людям. С точки зрения открытия/закрытия процесса как лучше поступать? Открыть раз и не париться или все таки лучше открывать/закрывать процесс по необходимости?
Забыл дописать, что использую С#.

Открыть и не закрывать до конца работы.
Не важно какой язык ты используешь, чтение памяти в винде осуществляется либо через драйвер (kernel режим), либо через WIN API (Application layer).
В данном случае второе.
Опять таки, всё зависит от ситуации, если ты работаешь с памятью раз в 5 минут, то вариант с "супер временным" handle-ом имеет место быть.
Но если у тебя чтение памяти каждые 0,2 секунды - то уж лучше держать один открытый хендл.
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
  Ответить с цитированием
Старый 22.03.2017, 12:07   #3
 Разведчик
Аватар для KLAIDY
 
KLAIDY никому не известный тип
Регистрация: 11.10.2010
Сообщений: 13
Популярность: 10
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 5 сообщениях
 
По умолчанию Re: Нужен совет по структуре приложения

Цитата:
Сообщение от NickiteeПосмотреть сообщение
Открыть и не закрывать до конца работы.
Не важно какой язык ты используешь, чтение памяти в винде осуществляется либо через драйвер (kernel режим), либо через WIN API (Application layer).
В данном случае второе.
Опять таки, всё зависит от ситуации, если ты работаешь с памятью раз в 5 минут, то вариант с "супер временным" handle-ом имеет место быть.
Но если у тебя чтение памяти каждые 0,2 секунды - то уж лучше держать один открытый хендл.

Спасибо за пояснения!
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Нужен совет. karakurt93 Общение и обсуждение 3 07.02.2016 15:34
[Обсуждение] нужен совет K-0-T Общение и обсуждение 0 14.12.2012 19:58
[Помогите!] нужен совет VortexWhy Общение и обсуждение 2 10.01.2012 04:51

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 10:15.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net