 |
Имя клана по ID (Delphi - / C# +) - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
18.08.2014, 22:19
|
#1
|
|
|
|
Разведчик
|
 Регистрация: 25.01.2013
 Сообщений: 13
 Популярность: 10
 Сказал(а) спасибо: 7
Поблагодарили 0 раз(а) в 0 сообщениях
|
Имя клана по ID (Delphi - / C# +)
подскажите пожалуйста, точнее ткните носом опорукого, функция получения имени клана по его ID. ID ищется нормально в обоих случаях, а вот имя в Delphi не могу получить....то ли ночь, то ли отсутствие головного мозга...ну или покажите рабочую функцию для Delphi.
C#(рабочая)
Код:
public static string GetClanName(int clanId)
{
Int32 p1, p2, p3;
char[] str = new char[32];
p1 = MemoryManager.ReadInt32(0x0C9DFAC);
p1 = MemoryManager.ReadInt32(p1 + 0x248);
p2 = MemoryManager.ReadInt32(p1 + 0x14);
p1 = MemoryManager.ReadInt32(p1 + 0xC);
p3 = clanId % p2;
p1 = MemoryManager.ReadInt32(p1 + p3 * 0x4);
while (p1 != 0)
{
p3 = MemoryManager.ReadInt32(p1 + 0xC);
if (p3 == clanId)
{
p1 = MemoryManager.ReadInt32(p1 + 0x8);
p1 = MemoryManager.ReadInt32(p1 + 0x4);
string s = MemoryManager.ReadString(p1, 32);
p1 = 0;
return s;
}
else
{
p1 = MemoryManager.ReadInt32(p1);
}
}
return "noclan";
}
Delphi/RadXE5 (не хочет заводиться, все время выкидывает из цикла и видит перса ноклан)
Код:
function ReadClanName(ClnID:LongWord): String;
var
p1, p2, p3 : int32;
Tmp: array [0..9] of WideChar;
NoB : Size_T;
ss : unicodestring;
begin
ReadProcessMemory(hProcess,Pointer(BaseAddress),@p1,4,nob);
ReadProcessMemory(hProcess,Pointer(p1+$248),@p1,4,nob);
ReadProcessMemory(hProcess,Pointer(p1+$14),@p2,4,nob);
ReadProcessMemory(hProcess,Pointer(p1+$C),@p1,4,nob);
p3 := ClnID mod p2;
ReadProcessMemory(hProcess,Pointer(p1+(p3*$4)),@p1,4,nob);
while p1<>0 do begin
ReadProcessMemory(hProcess,Pointer(p1+$C),@p3,4,nob);
if ( p3 = ClnID ) then begin
ReadProcessMemory(hProcess,Pointer(p1+$8),@p1,4,nob);
ReadProcessMemory(hProcess,Pointer(p1+$4),@p1,4,nob);
ReadProcessMemory(hProcess,Pointer(p1),@Tmp,32,nob);
ss := Tmp;
p1 := 0;
result := ss;
end else ReadProcessMemory(hProcess,Pointer(p1),@p1,4,nob);
end;
result := ' - ';
end;
|
|
|
18.08.2014, 23:42
|
#2
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: Имя клана по ID (Delphi - / C# +)
а воспользоваться великим дебагером пробовали? в XE5 он хоть и тормознутый, но адекватно работает. Ставьте бряк на точку входа в цикл и смотрите какие данные прогоняются, вполне вероятно что переменная hProcess неверная, так как Delphi любитель сбрасывать ее, а быть точнее открытый процесс
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
|
|
|
19.08.2014, 08:12
|
#3
|
|
|
|
Пехотинец
|
 Регистрация: 17.09.2010
 Сообщений: 66
 Популярность: 701
 Сказал(а) спасибо: 32
Поблагодарили 63 раз(а) в 46 сообщениях
|
Re: Имя клана по ID (Delphi - / C# +)
Код:
ReadProcessMemory(hProcess,Pointer(p1+$0),@Tmp,32,nob);
и имена переменных лучше не коверкать
NoB : Size_T; .... nob
а и result := ' - '; у тебя всегда возвращает "-"
________________
© Mel
Последний раз редактировалось _DVD_; 19.08.2014 в 08:14.
|
|
|
Пользователь сказал cпасибо:
|
|
19.08.2014, 11:22
|
#4
|
|
|
|
Разведчик
|
 Регистрация: 25.01.2013
 Сообщений: 13
 Популярность: 10
 Сказал(а) спасибо: 7
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Имя клана по ID (Delphi - / C# +)
разобрался, данная функция работоспособна на текущей версии руоффа. (компилировалось на Rad XE5)
Код:
function ReadClanName(ClnID:DWord): WideString;
var
p1, p2, p3 : DWord;
NoB : Size_T;
begin
p1 := PwReadInt32(BaseAddress);
p1 := PwReadInt32(p1 + $248);
p2 := PwReadInt32(p1 + $14);
p1 := PwReadInt32(p1 + $C);
p3 := ClnID mod p2;
p1 := PwReadInt32(p1 + p3*$4);
while (p1 <> 0) do
begin
p3 := PwReadInt32(p1 + $C);
if p3 = ClnID then
begin
p1 := PwReadInt32(p1 + $8);
p1 := PwReadInt32(p1 + $4);
Result := PwReadStr(p1,32);
p1 := 0;
end
else p1 := PwReadInt32(p1+$0);
end;
end;
Последний раз редактировалось scitelz; 19.08.2014 в 12:14.
Причина: Добавлено сообщение
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 13:47.
|
 |