 |
Нужен совет по структуре приложения - Вопросы и ответы, обсуждения - Ваши вопросы по C# только в данном разделе |
15.03.2017, 17:38
|
#1
|
|
|
|
Разведчик
|
 Регистрация: 11.10.2010
 Сообщений: 13
 Популярность: 10
 Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 5 сообщениях
|
Нужен совет по структуре приложения
Привет, форумчане  .
У меня возник следующий вопрос, нужен совет опытных людей.
Пишу приложение, внедряющееся в процесс (короче ингейм бота). Имеется основной класс 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 в 17:46.
|
|
|
18.03.2017, 21:49
|
#2
|
|
|
|
Рыцарь-защитник
|
 Регистрация: 28.08.2009
 Сообщений: 603
 Популярность: 19129
 Золото Zhyk.Ru: 500
 Сказал(а) спасибо: 84
Поблагодарили 602 раз(а) в 321 сообщениях
|
Re: Нужен совет по структуре приложения
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Привет, форумчане .
У меня возник следующий вопрос, нужен совет опытных людей.
Пишу приложение, внедряющееся в процесс (короче ингейм бота). Имеется основной класс 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, 13:07
|
#3
|
|
|
|
Разведчик
|
 Регистрация: 11.10.2010
 Сообщений: 13
 Популярность: 10
 Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 5 сообщениях
|
Re: Нужен совет по структуре приложения
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
[Помогите!] Нужен совет.
|
karakurt93 |
Общение и обсуждение |
3 |
07.02.2016 16:34 |
[Обсуждение] нужен совет
|
K-0-T |
Общение и обсуждение |
0 |
14.12.2012 20:58 |
[Помогите!] нужен совет
|
VortexWhy |
Общение и обсуждение |
2 |
10.01.2012 05:51 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 04:09.
|
 |