![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Присвоение 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^);