Форум: "Основная";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];
ВнизПрисвоение WideString PWideChar Найти похожие ветки
← →
Tobeus © (2008-09-25 01:30) [0]В общем есть некая либа написанная на сях. Она передает юникодную строку через PWideChar.
В коде у меня так:
var
str1:WideString;
str2:PWideChar;
str2 это то что передает либа. str1 это то чем я пользуюсь у себя.
использую обычное присвоение:
str1:=str2;
И всё нормально, но только на отностительно небольших строках. Но на более менее больших строках (даже на 200КБ) на этом присвоение вылетает:
EAccesViolation in module "oleaut32.dll"
Видимо я как то с ними неправильно работаю. Подскажите в чем ошибка?
Delphi2007
← →
Vlad Oshin © (2008-09-25 09:39) [1]а так если?
str1:=WideString(str2^);
← →
han_malign © (2008-09-25 10:20) [2]куда передает, как передает - прототип функции приведи.
str1:=str2 - к "oleaut32.dll" отношения не имеет, ошибка в другом месте...
← →
Сергей М. © (2008-09-25 10:31) [3]
> han_malign © (25.09.08 10:20) [2]
> str1:=str2 - к "oleaut32.dll" отношения не имеет
Ошибаешься, в данном случае имеет.
← →
Сергей М. © (2008-09-25 10:39) [4]
> han_malign © (25.09.08 10:20) [2]
Конкретно при инициализации юникодовой строки происходит как минимум вызов oleaut32.SysAllocStrLen
← →
Сергей М. © (2008-09-25 10:41) [5]Подозреваю что дело вовсе не в длине строки, а в том что передаваемые данные строкой на самом деле не являются, а именно не содержат символа-терминатора.
← →
Vlad Oshin © (2008-09-25 10:46) [6]
> передаваемые данные строкой на самом деле не являются, а
> именно не содержат символа-терминатора
тоже так думаю
← →
Поросенок Винни-Пух © (2008-09-25 10:48) [7]>строкой на самом деле не являются, а .....
а являются нилом.
← →
Сергей М. © (2008-09-25 11:10) [8]
> а являются нилом
А нифига.
Ниловая ситуация обрабатывантся вполне корректно - проверка на нил производится перед самым первым вызовом ф-ции из oleaut32
← →
han_malign © (2008-09-25 11:21) [9]
> а являются нилом.
- nil - штатное значение для (Wide)String
← →
han_malign © (2008-09-25 11:24) [10]
> проверка на нил производится перед самым первым вызовом ф-ции из oleaut32
- поиск нуля тоже...
← →
Tobeus © (2008-09-25 11:34) [11]Exception вылетает именно на этой строке.
Написал я только не совсем точно. Всё происходит в моей dll, написанной в delphi. Ее вызывает другая dll написаная на сях. Эта dll мне передает указатель на юникодную строку, которую я уже обрабатываю. Первое действие в моей функции это именно присвоение. На строках поменьше никаких проблем, 100KB передается четко. А вот где то на 200KB вылетает эта ошибка.
← →
Поросенок Винни-Пух © (2008-09-25 11:36) [12]кто память распределяет под строку?
← →
Tobeus © (2008-09-25 11:37) [13]Ох, пока писал, уже ответов прибавилось. Насчет нуля проверим, хотя сомневаюсь, что в этом проблема, всё таки C++, у них там все строки такие.
← →
clickmaker © (2008-09-25 12:04) [14]а так?
SetLength(str1, lstrlenW(str1) * 2 + 1);
lstrcpyW(PWideChar(str1), str2);
← →
Riply © (2008-09-25 12:40) [15]> [12] Поросенок Винни-Пух © (25.09.08 11:36)
> кто память распределяет под строку?
Мне тоже будет интересен ответ этот вопрос :)
← →
KSergey © (2008-09-25 13:32) [16]К стати, если строка таких офигительных размеров - зачем ее переприсваивать дельфийской строке? Может с исходной и работать, если возможно?
Хотя в общем случае проблемы это явно не уберет.
← →
Поросенок Винни-Пух © (2008-09-25 14:42) [17]слабо верится что сишная либа распределяет память под строку, возвращает pwidechar на нее и не убивает саму строку после этого до самого прихода
← →
KSergey © (2008-09-26 12:18) [18]и тишина....
← →
Сергей М. © (2008-09-26 12:24) [19]
> и тишина
Видать само собой рассосалась проблема)
← →
Anatoly Podgoretsky © (2008-09-26 12:32) [20]само собой?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c