Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизString vs. WideString в DLL Найти похожие ветки
← →
Egloo (2004-12-29 16:51) [0]Здравствуйте.
Создаю в DLL функцию (ниже), заведомо не подключая ShareMem:
function GetString(Value: String): String; stdcall;
begin
Result := Value + "!!!";
end;
Компилирую, вызываю из программы, выдает Invalid Pointer Operation.
Тогда заменяю String на WideString (опять же, без подключения ShareMem), т.е.:
function GetString(Value: WideString): WideString; stdcall;
begin
Result := Value + "!!!";
end;
Компилирую, вызываю из программы - все ок, выдает: Value + "!!!"...
Т.е. Widestring уже дельфей передается, как указатель на первый символ строки?
Вот назрело несколько вопросов:
1. В чем отличие String от WideString (кроме одно-, двубайтовости)?
А конкретнее, как передаются String и WideString?
2. Какова совместимость такой библиотеки, например, с C?
Или, как нужно корректно указывать/передавать типы String и WideString для поддержки с C? PСhar и PWideChar?
Заранее спасибо за ответ :)
← →
Egloo (2004-12-29 17:15) [1]Ответ нашел тут:
http://www.relib.com/forums/topic.asp?id=813427
Про LongString понятно, но:
Если WideString передаеся, как указатель на первый симол в строке и PWideChar - тоже указатель на первый символ, то в чем разница между ними? :)
Во всех WinAPI-шных функциях(например, Windows.pas) используется PWideChar...
← →
У (2004-12-29 17:58) [2]для выделения памяти под String используется
стандартный борландовский менеджер памяти,
а для WideString - нет.
← →
Fay © (2004-12-29 18:07) [3]2 (29.12.04 17:58) [2]
нестандартный?
← →
Суслик © (2004-12-29 18:08) [4]
> [3] Fay © (29.12.04 18:07)
сомневаешься?
посмотри cpu
← →
Суслик © (2004-12-29 18:10) [5]
> [3] Fay © (29.12.04 18:07)
они (widestring) из-за этого и медленные страшно :((
← →
Fay © (2004-12-29 18:11) [6]Я просто интересуюсь - что используется?
← →
Суслик © (2004-12-29 18:13) [7]
> Я просто интересуюсь - что используется?
не момню. См cpu
← →
Fay © (2004-12-29 18:16) [8]Посмотрел. Так у меня и возник вопрос.
← →
Egloo (2004-12-30 09:08) [9]Дельный ответ:
http://bb.ct.kz/index.php?showtopic=41034&st=0&#entry1236214
Спасибо всем!
← →
У (2004-12-30 11:57) [10]Некоторые коментарии к дельному ответу:
>1. Кажется, всё верно (или я невнимательно прочитал?)
>2. Delphi-строки. Имеют служебное поле размером два байта, т.е. >длина строки может быть до 65535 символов.
На самом деле длинные строки обычно
имеют служебные данные размером 12 байт = 4 длина, 4 счётчик ссылок и 4 количество выделенной памяти, обычно равное длине +
выравнивание. Заголовок располагается по отрицательному смещению.
(В случае локальных строк, инициализированных константой
заголовок, кажется, немного другой).
>3. ...
На счёт Wide-Pascal строк с их гигантскими накладными
расходами я просто затрудняюсь что-либо сказать,
так как я не понял, что автор имел ввиду.
>4.
>Каждая комбинированная строка принудительно
>завершается нулем (в отличие от предыдущих типов)
На самом деле ВСЕ строки, кроме паскаль-строк,
завершаются нулём и передаются как указатель на первый символ.
На первоначального вопроса:
Выделение памяти под WideString происходит с
помощью функций из oleaut32.dll (SysReAllocStringLen и др.).
Соответственно их можно ВСЕГДА безопасно передавать
в/из ДЛЛ.
Выделение памяти под AnsiString производится с
помощью стандартного борландовского менеджера памяти,
и их передавать в/из ДЛЛ можно
только в том случае, когда этот борландовский менеджер
памяти тоже вынесен в отдельную ДЛЛ - т.е. uses ShareMem.
В противном случае в каждой ДЛЛ будет свой
менеджер памяти.
← →
Egloo (2004-12-30 12:04) [11]Спасибо за еще более дельный ответ :)
С наступающим! :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c