Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Присвоение WideString PWideChar [WinXP]


Tobeus ©   (2008-09-25 01:30:00) 

В общем есть некая либа написанная на сях. Она передает юникодную строку через PWideChar.
В коде у меня так:

var
str1:WideString;
str2:PWideChar;

str2 это то что передает либа. str1 это то чем я пользуюсь у себя.

использую обычное присвоение:
str1:=str2;

И всё нормально, но только на отностительно небольших строках. Но на более менее больших строках (даже на 200КБ) на этом присвоение вылетает:
EAccesViolation in module 'oleaut32.dll'

Видимо я как то с ними неправильно работаю. Подскажите в чем ошибка?

Delphi2007


Anatoly Podgoretsky   (2008-09-26 12:32:00) [1]

само собой?


Сергей М.   (2008-09-26 12:24:00) [2]


> и тишина


Видать само собой рассосалась проблема)


KSergey   (2008-09-26 12:18:00) [3]

и тишина....


Поросенок Винни-Пух   (2008-09-25 14:42:00) [4]

слабо верится что сишная либа распределяет память под строку, возвращает pwidechar на нее и не убивает саму строку после этого до самого прихода


KSergey   (2008-09-25 13:32:00) [5]

К стати, если строка таких офигительных размеров - зачем ее переприсваивать дельфийской строке? Может с исходной и работать, если возможно?
Хотя в общем случае проблемы это явно не уберет.


Riply   (2008-09-25 12:40:00) [6]

> [12] Поросенок Винни-Пух ©   (25.09.08 11:36)
> кто память распределяет под строку?

Мне тоже будет интересен ответ этот вопрос :)


clickmaker   (2008-09-25 12:04:00) [7]

а так?

SetLength(str1, lstrlenW(str1) * 2 + 1);
lstrcpyW(PWideChar(str1), str2);


Tobeus   (2008-09-25 11:37:00) [8]

Ох, пока писал, уже ответов прибавилось. Насчет нуля проверим, хотя сомневаюсь, что в этом проблема, всё таки C++, у них там все строки такие.


Поросенок Винни-Пух   (2008-09-25 11:36:00) [9]

кто память распределяет под строку?


Tobeus   (2008-09-25 11:34:00) [10]

Exception вылетает именно на этой строке.

Написал я только не совсем точно. Всё происходит в моей dll, написанной в delphi. Ее вызывает другая dll написаная на сях. Эта dll мне передает указатель на юникодную строку, которую я уже обрабатываю. Первое действие в моей функции это именно присвоение. На строках поменьше никаких проблем, 100KB передается четко. А вот где то на 200KB вылетает эта ошибка.


han_malign   (2008-09-25 11:24:00) [11]


> проверка на нил производится перед самым первым вызовом ф-ции из oleaut32

- поиск нуля тоже...


han_malign   (2008-09-25 11:21:00) [12]


> а являются нилом.

- nil - штатное значение для (Wide)String


Сергей М.   (2008-09-25 11:10:00) [13]


> а являются нилом


А нифига.

Ниловая ситуация обрабатывантся вполне корректно - проверка на нил производится перед самым первым вызовом ф-ции из oleaut32


Поросенок Винни-Пух   (2008-09-25 10:48:00) [14]

>строкой на самом деле не являются, а .....

а являются нилом.


Vlad Oshin   (2008-09-25 10:46:00) [15]


> передаваемые данные строкой на самом деле не являются, а
> именно не содержат символа-терминатора

тоже так думаю


Сергей М.   (2008-09-25 10:41:00) [16]

Подозреваю что дело вовсе не в длине строки, а в том что передаваемые данные строкой на самом деле не являются, а именно не содержат символа-терминатора.


Сергей М.   (2008-09-25 10:39:00) [17]


> han_malign ©   (25.09.08 10:20) [2]


Конкретно при инициализации юникодовой строки происходит как минимум вызов oleaut32.SysAllocStrLen


Сергей М.   (2008-09-25 10:31:00) [18]


> han_malign ©   (25.09.08 10:20) [2]


> str1:=str2 - к 'oleaut32.dll' отношения не имеет


Ошибаешься, в данном случае имеет.


han_malign   (2008-09-25 10:20:00) [19]

куда передает, как передает - прототип функции приведи.

str1:=str2 - к 'oleaut32.dll' отношения не имеет, ошибка в другом месте...


Vlad Oshin   (2008-09-25 09:39:00) [20]

а так если?

str1:=WideString(str2^);


Наверх

Титульная страница Поиск, карта сайта Написать письмо