Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#46: 2008-03-12 16:02:36 ЛС | профиль | цитата
tsdima писал(а):
WideString(Pointer(Result)) или WideString(Result), в данном случае скорее всего не безразлично

Да, все правильно...
Дополнительный преобразователь типа Pointer, это способ "надурить самого себя", т.е., заставить "не заметить для уничтожения" объект который таки создается.
Правда уже внутри _WStrFromPCharLen
Одним из двух способов: _WStrFromPWCharLen(Dest, @Buffer, DestLen), или _WStrSetLength(Dest, DestLen)
Скажем первый, выглядит так:

asm
{ -> EAX Pointer to WideString (dest) }
{ EDX Pointer to characters (source) }
{ ECX number of characters (not bytes) }
TEST ECX,ECX
JE _WStrClr

PUSH EAX

PUSH ECX
PUSH EDX
CALL SysAllocStringLen
TEST EAX,EAX
JE WStrError

POP EDX
PUSH [EDX].PWideChar
MOV [EDX],EAX

CALL SysFreeString
end;
карма: 9

0
Ответов: 2125
Рейтинг: 159
#47: 2008-03-12 17:55:56 ЛС | профиль | цитата
Всё тут правильно, старая строка уничтожается, новая (копия Buffer) создаётся. Что не устраивает-то?
И Result := nil стоит тоже не зря
Типа старой строки не было
карма: 1

0
Ответов: 9906
Рейтинг: 351
#48: 2008-03-12 18:15:54 ЛС | профиль | цитата
Понятно все в кодах - это больше рассуждения вслух..
А вот "неправильно" то, что конструктор объекта сидит в System.pas, а деструктор - в оси
"Надурение самого себя" - так белые люди тоже не делают
А что там со счетчиком ссылок после этого - совсем непонятно

В общем, трудно жить человеку, который на слово не верит - замучаешься проверять

карма: 9

0
Ответов: 2125
Рейтинг: 159
#49: 2008-03-12 18:47:44 ЛС | профиль | цитата
Galkov писал(а):
А вот "неправильно" то, что конструктор объекта сидит в System.pas, а деструктор - в оси

Деструктор WideString как пить дать состоит из SysFreeString. Что-ж ты его в нарезке не показал
А вышеприведённый код - не что иное как "ненавязчивая" оптимизация. Нафига дёргать конструкторы/деструкторы WideString, когда и без них можно. Всё равно на это никто не смотрит. Кроме тебя.
карма: 1

0
Ответов: 9906
Рейтинг: 351
#50: 2008-03-12 19:39:19 ЛС | профиль | цитата
Да я вижу, что никто не смотрит...
Только потом появляются "ненавязчивые" коды

#pas
FParser.ParseScriptText(StringToOleStr(Value),...);
И попробуй после такого: во-первых - заметить, во-вторых - пофиксить
В FTCGCodeGen.dpr, кстати говоря, таких пенок тоже, выше крыши.
И это все далеко не мальчики писали

Так и живем: создаем сами себе трудности, а потом их героически преодолеваем
Вся энергия на гудок и уходит...
Потому-что на это никто не смотрит, кроме меня


------------ Дoбавленo:

Ну ничего, у меня "свобода" началась - взял отпуск за два прошлых года. А там глядишь, и за этот присовокуплю
Пока отсыпаюсь, но: вот брошу пить - возьмусь за вас
карма: 9

0
Разработчик
Ответов: 26153
Рейтинг: 2127
#51: 2008-03-12 21:51:43 ЛС | профиль | цитата
Galkov писал(а):
возьмусь за вас
Но ты это там... осторожно, ногами не бить
карма: 22

0
Ответов: 8926
Рейтинг: 823
#52: 2008-03-13 10:29:17 ЛС | профиль | цитата
Galkov, поздравляю с долгожданным отпуском, обязательно куда-нибудь надо съездить (например, по меридиану на юг на 3 тысячи км и вверх на 8 км )
карма: 19

0
Ответов: 9906
Рейтинг: 351
#53: 2008-03-14 17:31:55 ЛС | профиль | цитата
Galkov писал(а):
А что там со счетчиком ссылок после этого - совсем непонятно

tsdima, вообще-то там, на эту тему, смешно как-то получается...
Посмотри внимательней


#pas
function _WStrAddRef(var str: WideString): Pointer;
asm
MOV EDX,[EAX]
TEST EDX,EDX
JE @@1
PUSH EAX
MOV ECX,[EDX-4]
SHR ECX,1
PUSH ECX
PUSH EDX
CALL SysAllocStringLen
POP EDX
TEST EAX,EAX
JE WStrError
MOV [EDX],EAX
@@1:
end;

Внимание, логическое утверждение: ЕСЛИ widestring в дельфях также имеет счетчик ссылок, ТОГДА это реализовано в ВИНДЕ (oleaut32.dll)

Т.е., если SysAllocStringLen имеет аргументом свой же результат, то он не меняется, но увеличивается некий RefCount, который учитывается при SysFreeString и SysReAllocString, SysReAllocStringLen

Что характерно, в MSDN про это ни слова не нашел...
tsdima, может ты встречал
карма: 9

0
Ответов: 2125
Рейтинг: 159
#54: 2008-03-14 18:23:36 ЛС | профиль | цитата
Galkov писал(а):
Внимание, логическое утверждение

Я полагаю, что:
1. счётчик ссылок есть у объектов в Дельфи (скорее всего так и есть)
2. widestring это объект
3. незачем иметь собственный счётчик ссылок для BSTR, если он уже есть в винде

Поэтому для объекта widestring процедуры учёта ссылок не стандартные, а те, что ты раскопал.
Заметь, [EDX-4] это всего лишь длина строки (если почитать про BSTR, то в MSDN написано length-prefixed string used by Automation). Про счётчик ссылок в MSDN ни слова, хотя я подозреваю что он в [EDX-8]. Именно поэтому не inc [EDX-8], а CALL SysAllocStringLen. Длинна там - в байтах, поэтому делится пополам, в результате получается абсолютно идентичная строка, и винды не копируют строку, а увеличивают счётчик ссылок.

------------ Дoбавленo:

Отсюда вывод: нельзя менять строку, выделенную при помощи SysAllocString (потому и придумали тип BSTR, который по сути OLECHAR*)
карма: 1

0
Ответов: 9906
Рейтинг: 351
#55: 2008-03-24 11:10:19 ЛС | профиль | цитата
Собственно в MSDN и про длину в [EDX-4] хоть и говорится, но использовать рекомендуют API (SysStringLen и SysStringByteLen)
Это я читал:
MSDN писал(а):
However, you can query a BSTR for its length rather than scan it, so it can contain embedded null characters. The length is stored as a 32-bit integer at the memory location preceding the data in the string. Instead of reading this location directly, applications should use the string manipulation functions to access the length of a BSTR

А вот про вышеуказанный "счетчик" - нет.
Тем и интересен (как мне показалось) факт, что он не есть принадлежность какого-то языка, а именно API

Что я раскопал в Дельфях то ли, что надо - так я не через пол-часа, как начал копать, сообщаю.
То.
У меня дурная привычка не верить, прежде всего - себе...


------------ Дoбавленo:

tsdima писал(а):
Отсюда вывод: нельзя менять строку, выделенную при помощи SysAllocString

Опять, это особо тонкое понимание слова "менять"
В дельфячем System.pas всякие _WStr{Cat|Cat3|CatN|Insert|Delete} создают новую через SysAllocStringLen, пишут в нее чего попало, а потом делают WStrSet(destWStr, tmpWStr):


#pas
procedure WStrSet(var S: WideString; P: PWideChar);
asm
XCHG [EAX],EDX
TEST EDX,EDX
JZ @@1
PUSH EDX
CALL SysFreeString
@@1:
end;
И не жужжат







------------ Дoбавленo:

Alexbootch писал(а):
stalkersts, скинь файл ...HiAsmElementsDelphiExampleDateBasePHONE.DBF на диск C и попробуй вот эту схему:

code_2162.txt

Народ
А как вы вообще с этими базами работаете, причем уже давно ведь

Добавил к примеру коллеги одну кнопочку <Отключить> для OLEdb.doClose - и все сразу же стало "падать"
На FPC - так по первому же нажатию, на Дельфи - после третьего...

Ну здесь-то ладно - починил ((если в я чего решил, то выпью обязательно))...
Неужто и с другими базами точно также...
карма: 9

0
Ответов: 1891
Рейтинг: 110
#56: 2008-03-24 22:58:56 ЛС | профиль | цитата
Galkov, писал(а):
Народ
А как вы вообще с этими базами работаете, причем уже давно ведь

Добавил к примеру коллеги одну кнопочку <Отключить> для OLEdb.doClose - и все сразу же стало "падать"
На FPC - так по первому же нажатию, на Дельфи - после третьего...

Ну здесь-то ладно - починил ((если в я чего решил, то выпью обязательно))...
Неужто и с другими базами точно также...


C компонентами OLE DB не работаю, т.к. довольно-таки часто все "падает", хотя и выполняются SQL инструкции. С другими компонентами тоже бывает, что все "падает". С SQLite работает все нормально.

Galkov, писал(а):
Ну здесь-то ладно - починил


В смысле починил
карма: 0
%time%
0
Ответов: 9906
Рейтинг: 351
#57: 2008-03-24 23:24:14 ЛС | профиль | цитата
В прямом
rev 480: (KOLEdb, hiOLEdb, hiOLEdb_Query, hiOLEdb_Session).pas
------------ Дoбавленo:

Правда не во всем еще разобрался: OLEdb.(doOpen => doClose) дают таки еще утечку памяти...
карма: 9

0
Ответов: 1891
Рейтинг: 110
#58: 2008-03-24 23:27:36 ЛС | профиль | цитата
Galkov, писал(а):
В прямом
rev 480: (KOLEdb, hiOLEdb, hiOLEdb_Query, hiOLEdb_Session).pas


Galkov, а где взять rev 480? На SVN вроде Revision 871
карма: 0
%time%
0
Ответов: 9906
Рейтинг: 351
#59: 2008-03-24 23:30:38 ЛС | профиль | цитата
Там и бери, они еще не испортились
((481-я - это tsdima починял hiUseActiveX.pas))
карма: 9

0
Главный модератор
Ответов: 2999
Рейтинг: 396
#60: 2008-03-24 23:31:37 ЛС | профиль | цитата
ODBC работает с DLL'ами и с этими файлами не связан.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)