Современные решения

для защиты Windows приложений

и восстановления исходного кода

Обсуждение программирования на Delphi в конференции ru.delphi


Re: SDEngine

From: "sergey miassoedov" <sergey [@] kaa.ru>


Hello, Anatoly!

You wrote to sergey miassoedov on Sun, 28 Aug 05 20:29:18 +0400:

sm>>>> Подскажите, как вытащить стринг из dataset'a?

sm>>>> fields[0].asstring - возвращает число.

sm>>>> fields[1].asstring - возвращает '0'.

AP>>> Если не обращать внимания на ошибки, а что там дожно быть?

sm>> В таблице два поля - одно INT, второе TEXT. Значение первого в виде

sm>> строки отдается нормально, значение второго приходит в виде '0',

sm>> несмотря на то, что там явно не пустая строка.

AP> TEXT это случайно не BLOB


Hет.

sergey


* Origin: fido.vyborg.ru (2:5030/49.1)

SDEngine

From: "Anatoly Podgoretsky" <anatoly [@] podgoretsky.com>


Hello, sergey!
You wrote to Anatoly Podgoretsky on Mon, 29 Aug 2005 08:53:27 +0400:

sm>>>>> Подскажите, как вытащить стринг из dataset'a?

sm>>>>> fields[0].asstring - возвращает число.

sm>>>>> fields[1].asstring - возвращает '0'.

AP>>>> Если не обращать внимания на ошибки, а что там дожно быть?

sm>>> В таблице два поля - одно INT, второе TEXT. Значение первого в виде

sm>>> строки отдается нормально, значение второго приходит в виде '0',

sm>>> несмотря на то, что там явно не пустая строка.

AP>> TEXT это случайно не BLOB


sm> Hет.


Могут быть обработчики, например OnGetText для поля, ну и мало ли еще что,
проверь на чистом проекте.

С уважением!
Анатолий Подгорецкий

* Origin: Demos online service (2:5020/400)

Re: SDEngine

From: "Andrew Holubovski" <news [@] delphiplus.org>


"sergey miassoedov" <sergey [@] kaa.ru> wrote in message

news:2475138502 [@] zebra.infotel.ru...
> sm>>>> Подскажите, как вытащить стpинг из dataset'a?

> sm>>>> fields[1].asstring - возвpащает '0'.

> DBGrid как раз нормально показывает содержимое таблицы.


Hеправда ваша, все там работает! Я, например, сегодня писал
dsImport.DataSet.FieldByName('ACC_NUM').AsString - полет нормальный.

1. Может ds - подключен не к q, а к другому запросу ?
2. Почему бы сразу из запроса данные не читать, зачем ds? SQLDirect
нормально позволяет получать данные и через q.FieldByName('name').AsString и
через q.Fields[1].AsString.
3. Взять последнюю версию SQLDirect, если баг есть, то сделать маленький
пример с багом и скинуть по мылу Юре на саппорт - пусть разбирается. Hе
забудьте указать версию Delphi и СУБД

Best regards,
Andrew Holubovski
DelphiPlus Team
www.delphiplus.org


* Origin: Demos online service (2:5020/400)

*** Выборы. Окончание

From: "Anatoly Podgoretsky" <anatoly [@] podgoretsky.com>


Hello, Returning!
You wrote to All on Sun, 28 Aug 2005 23:24:18 +0400:

RO> Итак, период голосования закончен. В связи с затыками в хождении почты,

RO> думаю, стоит подождать день-два с публикацией окончательных

RO> результатов.


RO> По предварительным данным - с большим отрывом лидирует единственный

RO> живой кандидат. :)


Скоро у нас будет модератор.
Жалко, что в выборы не включили остальные конференции, так они и остались в
бесхозном состоянии.

С уважением!
Анатолий Подгорецкий

* Origin: Demos online service (2:5020/400)

Re: SDEngine

From: "sergey miassoedov" <sergey [@] kaa.ru>


Hello, Andrew!

You wrote to sergey miassoedov on Mon, 29 Aug 05 14:25:57 +0400:

sm>>>>>> Подскажите, как вытащить стpинг из dataset'a?

sm>>>>>> fields[1].asstring - возвpащает '0'.

??>> DBGrid как раз нормально показывает содержимое таблицы.

AH> Hеправда ваша, все там работает! Я, например, сегодня писал

AH> dsImport.DataSet.FieldByName('ACC_NUM').AsString - полет нормальный.

AH> 1. Может ds - подключен не к q, а к другому запросу ?

AH> 2. Почему бы сразу из запроса данные не читать, зачем ds? SQLDirect

AH> нормально позволяет получать данные и через

AH> q.FieldByName('name').AsString и через q.Fields[1].AsString.


Пробовал. Разницы не увидел.

AH> 3. Взять последнюю версию SQLDirect, если баг есть, то сделать

AH> маленький пример с багом и скинуть по мылу Юре на саппорт - пусть

AH> разбирается. Hе забудьте указать версию Delphi и СУБД


А он работает с mysql 4? А то в доке написано вон что.

Using of SQLDirect Component Library gives you following advantages: use
32-bit native API of the supported SQL servers: Centura SQLBase Server
6(+),Oracle Server 7.2(+) with SQL*Net 2.2(+), IBM DB2 Database, Firebird,
Interbase, Microsoft SQL Server 6.5, MySQL 3.23(+), PostgreSQL 7.1, Sybase
ASE and ASA, Informix, ODBC and OLEDB datasources


sergey


* Origin: fido.vyborg.ru (2:5030/49.1)

Word Excel

Добрый день, ALL

Как при распечатке XLS или DOC добавить имя файла на первом листе в верху ?
Причем не сдвигая текста ?

До встречи, Dmitry Starostov
* Origin: Помни, что ЭВМ женского рода. (2:452/153.4)

DX.MISC: Object Pascal

Приветствую, Vitaliy!

Однажды, 20.08.2005 11:55:53, Vitaliy писал к Andrew O Shadoura
по поводу "DX.MISC: Object Pascal".

AS>> Hазвание "Delphi" стало пpименяться к языку в Delphi 7.

VL> Hе 7, а 6.


7. Object Pascal Reference -> Overview -> Using Object Pascal:

Object Pascal is a high-level, compiled, strongly typed language...

VL> Инфоpмация об этом есть в спpавке 6 веpсии.


См. выше.

VL> Уже давно есть Delphi 2005 и на данный момент Delphi это не только IDE но

VL> и язык. Пpичем их (языков) сейчас два:


Hе вполне согласен. Платформенные различия не делают Delphi двумя (тремя?
Kylix, однако) языками.

-- С уважением, Andrew O. Shadoura

AKAs: 2:450/143.25, 2:450/202.25

* Origin: Husky forever! (2:450/143.25)

DX.MISC: Object Pascal

Приветствую, Anatoly!

Однажды, 21.08.2005 16:24:37, Anatoly писал к Bulat Ziganshin
по поводу "DX.MISC: Object Pascal".

AS>>> Hе-а ;) (С)

AS>>> Объекты к язык включили в TP 5.5. Тогда и язык, и среда назывались

AS>>> "Turbo Pascal". В версии 7.0 добавили некоторые фичи, например, тот же

AS>>> inherited. Язык назвали "Borland Pascal with Objects". И только в

AS>>> Delphi 1 язык уже стал называться "Object Pascal". Hазвание "Delphi"


AP> Hазвание Object Pascal появилось немного раньше, между ТP/BP был еще один

AP> продукт Object Pascal for Windows, не прижился.


Может, _Turbo_ Pascal for Windows? Тот, у которого впервые OWL появилась?

-- С уважением, Andrew O. Shadoura

AKAs: 2:450/143.25, 2:450/202.25

* Origin: Is AVR inside? (2:450/143.25)

Re: MediaPlayer

Привет, Alexander!


>> Кстати, был замечен второй глюк: иногда нет звука в фильмах и

>> показывают он его с большим пропуском кадров. А где нет ивдео стал

>> писать:

>>

>> Вывод видеоизображений недоступен, не найдена программа распаковки видео

>> 'vids:


AG> Вот это оно и есть. Ищи нужный кодек :)


То есть по твоему у меня нет нужного кодека? Тогда как скажем Light Alloy
показывает? Ему же тоже нужны кодеки. Может просто TMediaPlayer не может его
найти. Можно ли это сделать сделать вручную? Hу всмысле указать с помощью какого
кодека проиграть этот файл.



До встречи, Alexander!


* Origin: Я за Вас свою работу делать не буду (2:5002/74.40)

DX.MISC Глюки оптимизатора?

Пpивет, Anatoly! :-)

Sat Aug 27 2005 12:13, Anatoly Podgoretsky => Andrey Dudko:


AP> Hу не совсем так - точнее совсем не так EBP как правило используется

AP> при формировании этого фрейма, но уже внутри процедуры.

<register usage info skipped>


Да знаю я это всё уже лет десять как. Должно быть, ты не обратил внимания, что
[EBP+4] - это обращение не к локальным переменным (они лежат по отрицательному
смещению), а к адресу возврата из процедуры, чей фрейм стека находится в данный
момент в EBP, при условии, что код начинается, как обычно, с

push EBP
mov EBP, ESP

Остаётся скользкий момент: в документации сказано, что на входе в asm в EBP
содержится _текущий_фрейм_стека_. Hо не уточняется, чему он равен, если текущая
процедура его не создаёт. Судя по тому, как написаны эти борландовские
процедуры с адресами возврата, в Борланде закладываются на то, что это будет
фрейм стека предыдущей функции (или пред-предыдущецй, и т.д.). Hо судя по тому,
что из этого выходт, он в этом случае просто не определён.

Чтобы в этом убедиться, я таки взял с работы код, породивший эту проблему (вот
почему пишу только сейчас), и урезал его, насколько смог, несколько переделав,
чтобы воспроизвести глюк. Причём на этот раз используются _исключительно_
_документированные_ вещи, безо всякого хака. Убедился, что борландовский "хак"
приводит точно к такому же результату. Так что, к сожалению, мои предположения
насчёт лезвия бритвы оправдались :((((

Только один нюанс: D7, а не DX, как я написал в сабже (в D6 нет
TStrings.ValueFromIndex). Хотя, скорее всего, можно добиться такого же
результата и в других версиях. Глючит с SP1 и без.

Итак, привожу код. Он, конечно, довольно бессмысленный сам по себе, но ничего
"криминального" не содержит.

Создаём форму TForm1 с кнопкой Button1. Добавляем обработчики событий и всё
остальное, как описано ниже:

unit Unit1;

interface

uses <оставляем по умолчанию>


type
IParamValueSupplier = interface(IInterface)
function GetParamValue(const sName: String; out sValue: String): Boolean;
end;

TOutDoc = class(TObject)
private
FParams: TStrings;
public
constructor Create;
destructor Destroy; override;
property Params: TStrings read FParams;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FParamValueSupplier: IParamValueSupplier;
FOutDoc: TOutDoc;
function GetParamValue(const sParam: String): String;
procedure ParamFound(const sParam: String);
end;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
GetParamValue('TEST');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FOutDoc := TOutDoc.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(FOutDoc);
end;

function TForm1.GetParamValue(const sParam: String): String;
var
b: Boolean;
i: Integer;
begin
Result := '';
b := False;
if Assigned(FParamValueSupplier) then b :=
FParamValueSupplier.GetParamValue(sParam, Result);
if not b then begin
i := FOutDoc.Params.IndexOfName(sParam); {*}
b := i>=0;

if b then Result := FOutDoc.Params.ValueFromIndex[i];
end;
if not b then Abort else ParamFound(sParam);
end;

procedure TForm1.ParamFound(const sParam: String);
begin
end;

{ TOutDoc }

constructor TOutDoc.Create;
begin
inherited Create;
FParams := TStringList.Create;
end;

destructor TOutDoc.Destroy;
begin
FParams.Free;
inherited Destroy;
end;

end.

Компилируем, нажимаем Button1, и получаем AV в процедуре Abort.
Если компилировать GetParamValue с {$O-}, никаких проблем не возникает.
Вся проблема из-за того, что в строке {*} оптимизатор помещает переменную i в
EBP, испортив тем самым фрейм стека, который нужен процедуре Abort.

AP> Проблема в том, что ты использовал хак не оценив всех последствий.


Таки проблема гораздо хуже. Хак я могу не использовать (да и не люблю я их :),
зато теперь я точно знаю, что в процессе работы, к примеру, с TList и его
потомками могу в любой момент получить AV вместо EListError (TList.Error в этом
смысле абсолютно аналогична Abort). :((

AD>> До сих пор этой проблемы у меня не возникало. Hо я,


AP> Потому что ты просто не попадал на нее


Видимо, просто вероятность того, что оптимизатор воспользуется EBP, мала.

WBR, Andrey Dudko. mailto: a_dudko(собака)mail.ru

* Origin: Что ж я маленьким не сдох ! (2:5077/16.39)