Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];

Вниз

Вот запарка мож кто заметит в чем проблема...   Найти похожие ветки 

 
Olorin   (2002-09-04 15:37) [0]

При вызове этой ф-ии возникает екзепшен в вызываюшей строке
Invalid variant operation как побороть да и почему?


function UOReadCharasterInfo(ProcHWND: HWND; Stat: TUOCharasterInfo): variant;
var
BytesRead: DWORD;
UOProcID: DWORD;
PtrToCharaster: DWORD;
PtrJournal: DWORD;
CharasterInfo: DWORD;
PtrTmp: DWORD;
PtrNxt: DWORD;
ProcHandle: THandle;
buff: array [0..13] of Char;
StrTmp: array[1..255] of Char;
Res: Variant;
begin
PtrToCharaster := $00C26164;
PtrJournal := $00D16B8C;
PtrNxt := 0;
UOProcID := 0;
BytesRead := 0;

GetWindowText(ProcHWND, buff, 14);
if (ProcHWND <> 0) and (StrPas(buff) = "Ultima Online") then begin
GetWindowThreadProcessId(ProcHWND, @UOProcID);
ProcHandle := OpenProcess(PROCESS_VM_READ, True, UOProcID);
ReadProcessMemory(ProcHandle, Ptr(PtrToCharaster), @CharasterInfo, 4, BytesRead);
case Stat of
CNAME: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $A4), @Res, 30, BytesRead);
STRN: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $C4), @Res, 2, BytesRead);
DEXT: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $C6), @Res, 2, BytesRead);
INTL: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $C8), @Res, 2, BytesRead);
HITS: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $CA), @Res, 2, BytesRead);
STAM: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $CE), @Res, 2, BytesRead);
MANA: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $D2), @Res, 2, BytesRead);
GOLD: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $D8), @Res, 4, BytesRead);
ARM: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $DC), @Res, 2, BytesRead);
WEIGHT: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $DE), @Res, 2, BytesRead);
LASTMSG: begin
ReadProcessMemory(ProcHandle, Ptr(PtrJournal), @PtrTmp, 4, BytesRead);
while PtrTmp <> 0 do begin
PtrNxt := PtrTmp + $18;
ReadProcessMemory(ProcHandle, Ptr(PtrNxt), @PtrTmp, 4, BytesRead);
end;
ReadProcessMemory(ProcHandle, Ptr(PtrNxt - $18), @PtrTmp, 4, BytesRead);
ReadProcessMemory(ProcHandle, Ptr(PtrTmp), @StrTmp, 255, BytesRead);
Result := LowerCase(Trim(StrTmp));
end;
end;
CloseHandle(ProcHandle);
Result := Res;
end
else begin
Result := False;
exit;
end;
end;


 
Olorin   (2002-09-04 15:53) [1]

Неужели и Ученика нет чтоб спасти страдающего Ола... :-)


 
Olorin   (2002-09-05 08:35) [2]

Хм никто не шарит в variant типах? :o(


 
ЮЮ   (2002-09-05 08:44) [3]

>вызове этой ф-ии возникает екзепшен в вызываюшей строке
А самому слабо точку останова поставить внутри функции?


 
ЮЮ   (2002-09-05 08:57) [4]

Почитай в Helpe
TVarData type
TVarData represents the internal structure of a Variant variable.
Врядли запись чего-то по адресу @Res обеспечит правильную структуру этого самого Res. Поэтому Result := Res просто обязана говорить Invalid variant operation


 
Olorin   (2002-09-05 08:58) [5]

>ЮЮ
Ставил результат нулевой... пишет variant array of unknown ничего то есть плохого... :o(


 
Olorin   (2002-09-05 09:08) [6]

Изменил код... теперь возвращаемое значение типизированно... вылетает Access violation at address.....


function UOReadCharasterInfo(ProcHWND: HWND; Stat: TUOCharasterInfo): String;
var
BytesRead: DWORD;
UOProcID: DWORD;
PtrToCharaster: DWORD;
PtrJournal: DWORD;
CharasterInfo: DWORD;
PtrTmp: DWORD;
PtrNxt: DWORD;
ProcHandle: THandle;
buff: array [0..13] of Char;
StrTmp: array[1..255] of Char;
Res: String;
begin
PtrToCharaster := $00C26164;
PtrJournal := $00D16B8C;
PtrNxt := 0;
UOProcID := 0;
BytesRead := 0;

GetWindowText(ProcHWND, buff, 14);
if (ProcHWND <> 0) and (StrPas(buff) = "Ultima Online") then begin
GetWindowThreadProcessId(ProcHWND, @UOProcID);
ProcHandle := OpenProcess(PROCESS_VM_READ, True, UOProcID);
ReadProcessMemory(ProcHandle, Ptr(PtrToCharaster), @CharasterInfo, 4, BytesRead);
case Stat of
CNAME: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $A4), @Res, 30, BytesRead);
STRN: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $C4), @Res, 2, BytesRead);
DEXT: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $C6), @Res, 2, BytesRead);
INTL: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $C8), @Res, 2, BytesRead);
HITS: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $CA), @Res, 2, BytesRead);
STAM: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $CE), @Res, 2, BytesRead);
MANA: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $D2), @Res, 2, BytesRead);
GOLD: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $D8), @Res, 4, BytesRead);
ARM: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $DC), @Res, 2, BytesRead);
WEIGHT: ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $DE), @Res, 2, BytesRead);
LASTMSG: begin
ReadProcessMemory(ProcHandle, Ptr(PtrJournal), @PtrTmp, 4, BytesRead);
while PtrTmp <> 0 do begin
PtrNxt := PtrTmp + $18;
ReadProcessMemory(ProcHandle, Ptr(PtrNxt), @PtrTmp, 4, BytesRead);
end;
ReadProcessMemory(ProcHandle, Ptr(PtrNxt - $18), @PtrTmp, 4, BytesRead);
ReadProcessMemory(ProcHandle, Ptr(PtrTmp), @StrTmp, 255, BytesRead);
Result := LowerCase(Trim(StrTmp));
end;
end;
CloseHandle(ProcHandle);
Result := Res;
end
else begin
Result := "False";
exit;
end;
end;


 
ЮЮ   (2002-09-05 09:26) [7]

Писать в Res:String также необдуманно, как и предыдущем варианте
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $A4), @Res, 30, BytesRead);


 
Olorin   (2002-09-05 11:17) [8]

>ЮЮ
Так какой вариант реализации тогда?


 
ЮЮ   (2002-09-05 11:49) [9]

SizeOf(Variant)=16
SizeOf(String)=4
A ты по адресу @Res пишешь 30 байт


 
Olorin   (2002-09-05 11:58) [10]

>ЮЮ
Да но во втором варианте Res: String
Или я что-то не понял??
Феня в том что и с остальными вызовами такая же петрушка!


 
ЮЮ   (2002-09-05 12:08) [11]

SizeOf(String)=4, причем это указатель, который ты портишь.
Можно сделать так
Res: String[255]
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $A4), @Res[0], 30, BytesRead);
SetLength(Res,BytesRead);



 
Dimk   (2002-09-05 12:25) [12]

Если уж так надо string
то надо сначала SetLength(Res, 31)
потом читать 30 байт по адресу PChar(Res)

string ( длинная строка по умолчанию ) это указатель
на структурв в памяти:

Pointer(Res)-8 количество ссылок на строку
Pointer(Res)-4 длина строки
Pointer(Res)+0 ASCIIZ строка ограниченная 0 кстати. ( для совместимости с PChar )

Что касается variant - то как правильно сказал(а) ЮЮ
он представляет собой структуру TVarData про которую долго писать а лучше позырить в доке.

А можно вместо строки использовать буфер или array of Char


 
Olorin   (2002-09-05 13:21) [13]

Упс... сорри... я идиот... ведь LASTMSG так же выбирается...


 
Olorin   (2002-09-05 13:27) [14]

И вся нелегкая! :o))

Спасибо всем кто помог мне и не бросил "в беде" :o)


function UOReadCharasterInfo(ProcHWND: HWND; Stat: TUOCharasterInfo): Variant;
var
BytesRead: DWORD;
UOProcID: DWORD;
PtrToCharaster: DWORD;
PtrJournal: DWORD;
CharasterInfo: DWORD;
PtrTmp: DWORD;
PtrNxt: DWORD;
ProcHandle: THandle;
buff: array [0..13] of Char;
StrTmp1: array[1..30] of Char;
StrTmp2: array[1..255] of Char;
Res: Variant;
begin
PtrToCharaster := $00C26164;
PtrJournal := $00D16B8C;
PtrNxt := 0;
UOProcID := 0;
BytesRead := 0;

GetWindowText(ProcHWND, buff, 14);
if (ProcHWND <> 0) and (StrPas(buff) = "Ultima Online") then begin
GetWindowThreadProcessId(ProcHWND, @UOProcID);
ProcHandle := OpenProcess(PROCESS_VM_READ, True, UOProcID);
ReadProcessMemory(ProcHandle, Ptr(PtrToCharaster), @CharasterInfo, 4, BytesRead);
case Stat of
CNAME: begin
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $A4), @StrTmp1, 30, BytesRead);
Result := Trim(StrTmp1);
end;
STRN: begin
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $C4), @Res, 2, BytesRead);
Result := Res;
end;
DEXT: begin
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $C6), @Res, 2, BytesRead);
Result := Res;
end;
INTL: begin
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $C8), @Res, 2, BytesRead);
Result := Res;
end;
HITS: begin
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $CA), @Res, 2, BytesRead);
Result := Res;
end;
STAM: begin
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $CE), @Res, 2, BytesRead);
Result := Res;
end;
MANA: begin
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $D2), @Res, 2, BytesRead);
Result := Res;
end;
GOLD: begin
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $D8), @Res, 4, BytesRead);
Result := Res;
end;
ARM: begin
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $DC), @Res, 2, BytesRead);
Result := Res;
end;
WEIGHT: begin
ReadProcessMemory(ProcHandle, Ptr(CharasterInfo + $DE), @Res, 2, BytesRead);
Result := Res;
end;
LASTMSG: begin
ReadProcessMemory(ProcHandle, Ptr(PtrJournal), @PtrTmp, 4, BytesRead);
while PtrTmp <> 0 do begin
PtrNxt := PtrTmp + $18;
ReadProcessMemory(ProcHandle, Ptr(PtrNxt), @PtrTmp, 4, BytesRead);
end;
ReadProcessMemory(ProcHandle, Ptr(PtrNxt - $18), @PtrTmp, 4, BytesRead);
ReadProcessMemory(ProcHandle, Ptr(PtrTmp), @StrTmp2, 255, BytesRead);
Result := LowerCase(Trim(StrTmp2));
end;
end;
CloseHandle(ProcHandle);
end
else begin
Result := False;
exit;
end;
end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.007 c
1-50710
Сергей Нечепуренко
2002-09-05 11:20
2002.09.16
Как запустить из программы другой exe файл?


3-50642
Kurt
2002-08-26 22:53
2002.09.16
Вопрос о компоненте QRBand! а точнее со свойством ColumnHeader


1-50757
jen_bond
2002-09-06 07:18
2002.09.16
Выбор ячейки в DBGrid


1-50771
Vikuksa
2002-09-06 10:15
2002.09.16
Excel


7-51010
VEG
2002-07-01 22:46
2002.09.16
Почему данный код не работает в Windows 95 и 98, но работает в Me





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский