• XSS.stack #1 – первый литературный журнал от юзеров форума

Адреса переменных, указатели и тд.

Статус
Закрыто для дальнейших ответов.

/dev/AVR

RAID-массив
Пользователь
Регистрация
11.11.2005
Сообщения
86
Реакции
0
Раньше, пишучи на DELPHI сильно не задумывался
над вод какой штукой. Напрмер

int GetWindowText(
HWND hWnd, // handle to window or control
LPTSTR lpString, // text buffer
int nMaxCount // maximum number of characters to copy
);

на месте LPSTR вставлял переменную buf(массив 0..255 из char) и все.
Или createService второй параметр-PCHARовская переменная. И все работает.
Т.е другими словами при юзанье APIшек вставлял туда просто переменные нужных типов\структур и все.

Но тут случайно у меня возник следующий вопрос:
MSDN пишет для строк как правило следующее
Код:
Pointer to a null-terminated string that specifies the name of the service to install.

По сути дела POINTER это указатель(тобиш адрес) на мой взгляд. Адрес переменной,
начальный адрес процедуры и т.д. В CreateThreadЕ его ясно почему надо юзать(@function).
Но судя из написанного в MSDNе, я должен @ку ставить перед каждой переменной PCHAR в API.
В ASMе это понятно(везде ADDR либо Offset), а вот в DELPHI не сильно.

Разъясните плиз когда в дельфе нужна @ка а когда нет при строковых параметрах.
Или это особенность компилятора что сам адрес привязывает к переменной если надо.
Надеюсь вы меня поняли :bang:
 
/dev/AVR
Я дельфи в принципе не юзаю, но вроде бы там, где нужен указатель, дельфи автоматом передает указатель. К тому же, как ты себе представляешь передачу в АПИ массива не по указателю? Это же просто жуть будет и апи слетит далеко и надолго. В винде всегда указатели передаются (или почти всегда ;)).
 
Это легко проверяется самостоятельно:

str := 'I am string';
MessageBox(0, @str,0,0); - вторым параметром передаём адресс ячейки памяти, где лежит указатель на строку.
MessageBox(0, pchar(str),0,0); - вторым параметром передаём непосредственно указатель на строку.

В отладчике это выглядит так:

MessageBox(0, @str,0,0):

Код:
  PUSH 0
  PUSH 0
  PUSH Project1.0044EC20;По адресу 0044EC20 лежит указатель на строку.
  PUSH 0
  CALL <JMP.&user32.MessageBoxA>

MessageBox(0, pchar(str),0,0):

Код:
  PUSH 0
  PUSH 0
  MOV EAX,DWORD PTR DS:[44EC20];А вот тут мы уже непосредственно передаём указатель на строку.
  CALL <Project1.@@LStrToPChar>
  PUSH EAX
  PUSH 0
  CALL <JMP.&user32.MessageBoxA>

Понятно?:) Если в общем случае, то @ используется когда надо передать УКАЗАТЕЛЬ на объект, строку или любую другую переменную.
 
BUG(O)R
Great
Большое спасибо за ответы. Теперь понял что DELPHяка если надо сама этот
указатель передает

Код:
FROM [b][userid]466[/userid][/b] 
MessageBox(0, pchar(str),0,0); - вторым параметром передаём непосредственно указатель на строку.

Просто без указателя так сказать это действительно для меня выглядело дико :blink:
Просто в ASMе они нужны везде и там более понятно. А как оказалось- трюк компилятора.

TO MODERATORS&Administators вопрос решен, тему можно закрывать !!!

[mod][Great:]
тему можно закрывать
всегда пожалста)[/mod]
 
Статус
Закрыто для дальнейших ответов.
Верх