· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Переменные в Delphi ?

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Окт 4, 2004 16:06:45

Есть прога написанна на Delphi 7. Уже готовый exe.

Там есть строка SQL запроса вида:

SELECT * FROM People where Act=

Переменная Act формируется динамически в програме.

В exe файле на ее месте некий код (заглушка) вида ... where Act= яяяя

в 16 ричном виде что то типа (после равно) 00 00 00 FF FF FF


Теперь вопрос:

Как формируется в Delphi переменные для формирования SQL строк ?

Могу ли я просто забить 16 ричный код "заглушки переменной" на некую константу вида Act= 1 или там нужно некое "обрамление" этой константы ?


Дата: Окт 4, 2004 16:23:53

Строки в Дельфи хранятся в следующем виде:
-8   4 байта   счётчик ссылок (-1=0xFFFFFFFF для констант)
-4   4 байта   длина строки (без завершающего нуля)
0    строка + нулевой байт

Таким образом, тебе надо исправить не только строку, но и длину.


Дата: Окт 5, 2004 10:29:52 · Поправил: leo

asmlamo
Прежде чем пытаться что-то "забивать" в экзешнике не мешало бы разобраться что это и с чем его едят. А у тебя одни пробелы\провалы:
> "Переменная Act" - это не переменная , а название поля (столбца) таблицы People.
> "на ее месте некий код (заглушка)" - это никакая не заглушка, а просто мусор в конце строковой константы для выравнивания или начало следующих данных.
> "Там есть строка" - где там, по какому адресу и в какой секции (в коде, в данных, в хипе) ?

Теперь ответ на вопрос:
"Как формируется в Delphi переменные для формирования SQL строк ?"
Начнем с того, что запросы бывают "обычные" и параметрические.
В обычном запросе, строго говоря, никаких переменных нет - серверу передается SQL-текст явно описывающий что, откуда и с какими условиями мы должны получить. Можно сказать, что весь текст SQL и является переменной. В Delphi компонент TQuery можно использовать "статически", если явно задать свойство TQuery.SQL.Text на этапе проектирования, а можно "динамически" - изменяя текст SQL в runtime. В этом случае можно изменять весь текст или только его часть - обычно условие where. Как мы его меняем ? Ну например, так Query1.SQL.Text:=FixText+Edit1.Text, где FixText - приведенная тобой строковая константа, а Edit1.Text - значение поля Act, введенное пользователем. Вопрос: что будет если ты в exe-шнике изменишь константу FixText ? Думаю, ничего хорошего. Тем более не известно, в каком виде она хранится - просто как PChar или в виде шаблона string (см. ответ reverser) - все зависит от того, как она была объявлена (или const FixText = .. или FixText:string = .. или прямо в операторе S1+S2).

Параметрические запросы - это несколько иное. На первый взгляд, это аналог функции Format или wsprintf - мы задаем постоянную часть запроса и набор переменных параметров различных типов. Для нас это действительно так, но суть параметрического запроса несколько глубже. Дело в том, что при изменении текста SQL сервер заново интерпретирует\компилирует запрос. "Глубинная" же суть параметрического запроса в том, что текст запроса грубо говоря компилируется один раз, а затем только изменяются его параметры, что несколько проще и быстрее. В параметрических SQL вместо значения параметра стоит символ вопроса, т.е. если бы в твоем примере использовался параметрический запрос, то было бы "... where Act=?"


Дата: Окт 5, 2004 15:42:42 · Поправил: asmlamo

Спасибо за развернутый ответ !

Буду повышать свои знания.

>Прежде чем пытаться что-то "забивать" в экзешнике не
>мешало бы разобраться что это и с чем его едят.

Согласен на 100%


> "Переменная Act" - это не переменная , а название поля
>(столбца) таблицы People.

Это понятно ! Я просто не правильно сказал.


Дата: Окт 5, 2004 18:48:38

asmlamo

Вопросы о Дельфи здесь запрещены. Ересь. Однако тему удалять не буду. Мне тоже очень понравился ответ leo. Только поэтому.


Дата: Окт 5, 2004 22:26:37

volodya
Вроде запрещены вопросы о программировании на дельфи. А это про уже про реверсинг программы, которая на нём написана, а это уже совсем другой вопрос.


Дата: Окт 5, 2004 22:46:04

dragon

Великий Даос сам решает, что считать ересью ;)

Твой эмуль положу


Дата: Окт 5, 2004 23:47:52

Да, положи. И убери надпись, что его компилировать надо, потому что компилировать его не надо :)
А насчёт вопроса, это не ересь, проги на дельфи очень часто встречаются и не мешало бы знать, как они устроены, помогает всё-таки.


Дата: Окт 6, 2004 02:01:43

> Твой эмуль положу

Ну и где эмуль? Я так понимаю речь идёт о новой версии отладчика..
Кстати, он соберётся под 4.30 или в нем заюзаны API появившиеся только начиная с 4.50 ?


Дата: Окт 6, 2004 02:46:59

В Delphi тоже есть асм в асм вставках, так почему же нельзя спрашивать вопросы по Delphi ? ;-)


Дата: Окт 6, 2004 03:55:00

Asterix

Завтра положу. Не бодай меня, и так устал...


Дата: Окт 6, 2004 10:07:42

Asterix
Я пробовал под 4.30, так и не собрал, не хотел компилироваться. Можешь попробовать, как появится(Там надо менять включааемый файл allins.hpp на ins.hpp). Только ещё условие, компилятор должен быть Intel C++, потому что cl.exe от MS не поддерживает 80-битный тип long double, сокращая его до 64 бит.


Дата: Окт 6, 2004 11:11:43

Вопросы о Дельфи здесь запрещены. Ересь.

Не совсем понял . Дельфи ты в смысле не любиш ?

А вопрос по реверсингу проги написанной на ЯВУ.
Возможно это Дельфи:)


Дата: Окт 6, 2004 12:03:08 · Поправил: leo

В продолжение темы: дельфийские причуды с локальными строковыми константами
Варианты объявления в процедуре:
1) const S = '...' или непосредственно в операторе конкатенации S1:=S2+'...'
- распределяется в коде после процедуры с 8-байтным префиксом: 4 счетчик ссылок (= -1) и 4 длина строки;
- ссылка на строку непосредственно по адресу;
2) const S:string = '...'
- распределяется в коде как вариант 1), но не после процедуры, а перед ней
- дополнительно в data создается dword - указатель на эту строку и в процедуре используется косвенная сссылка на строку через этот dword (?! - а мы тут недавно глобальные переменные обсуждали - логику искали...);
3) const S:PChar = '...'
- все также как в варианте 2), только без 8-байтного префикса;
4) const S:array[0..Х] of Char = '...'
- распределяется в data (ес-но без префикса);
- ссылка непосредственно по адресу;
(Ну ес-но во всех случаях выравнивание начала и длины строки на 4)
Вот такие фокусы..., или ересь - кому как нравится...

asmlamo
"Возможно это Дельфи"
Если еще не пробовал, то запусти прогу в DeDe by DaFixer/TMG - она те даст ответ, дельфи это или нет (поэзия однако..)


Дата: Окт 6, 2004 13:35:05

dragon
> Только ещё условие, компилятор должен быть Intel C++

Плохо, у меня не было в планах качать этот компилятор %)

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.050