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

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

String vs. WideString в DLL


Egloo ©   (2004-12-29 16:51:00) 

Здравствуйте.

Создаю в 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-30 12:04:00) [1]

Спасибо за еще более дельный ответ :)
С наступающим! :)


У   (2004-12-30 11:57:00) [2]

Некоторые коментарии к дельному ответу:
 
>1. Кажется, всё верно (или я невнимательно прочитал?)

>2. Delphi-строки. Имеют служебное поле размером два байта, т.е. >длина строки может быть до 65535 символов.

На самом деле длинные строки обычно
имеют служебные данные размером 12 байт = 4 длина, 4 счётчик ссылок и 4 количество выделенной памяти, обычно равное длине +
выравнивание. Заголовок располагается по отрицательному смещению.
(В случае локальных строк, инициализированных константой
заголовок, кажется, немного другой).

>3. ...
На счёт Wide-Pascal строк с их гигантскими накладными
расходами я просто затрудняюсь что-либо сказать,
так как я не понял, что автор имел ввиду.

>4.
>Каждая комбинированная строка принудительно
>завершается нулем ( в отличие от предыдущих типов)

На самом деле ВСЕ строки, кроме паскаль-строк,
завершаются нулём и передаются как указатель на первый символ.



На первоначального вопроса:

Выделение памяти под WideString происходит с
помощью функций из oleaut32.dll (SysReAllocStringLen и др.).
Соответственно их можно ВСЕГДА безопасно передавать
в/из ДЛЛ.

Выделение памяти под AnsiString производится с
помощью стандартного борландовского менеджера памяти,
и их передавать в/из ДЛЛ можно
только в том случае, когда этот борландовский менеджер
памяти тоже вынесен в отдельную ДЛЛ - т.е. uses ShareMem.
В противном случае в каждой ДЛЛ будет свой
менеджер памяти.


Egloo   (2004-12-30 09:08:00) [3]

Дельный ответ:
http://bb.ct.kz/index.php?showtopic=41034&st=0&#entry1236214

Спасибо всем!


Fay   (2004-12-29 18:16:00) [4]

Посмотрел. Так у меня и возник вопрос.


Суслик   (2004-12-29 18:13:00) [5]


> Я просто интересуюсь - что используется?

не момню. См cpu


Fay   (2004-12-29 18:11:00) [6]

Я просто интересуюсь - что используется?


Суслик   (2004-12-29 18:10:00) [7]


> [3] Fay ©   (29.12.04 18:07)

они (widestring) из-за этого и медленные страшно :((


Суслик   (2004-12-29 18:08:00) [8]


>  [3] Fay ©   (29.12.04 18:07)

сомневаешься?
посмотри cpu


Fay   (2004-12-29 18:07:00) [9]

2 (29.12.04 17:58) [2]
нестандартный?


У   (2004-12-29 17:58:00) [10]

для выделения памяти под String используется
стандартный борландовский менеджер памяти,
а для WideString - нет.


Egloo   (2004-12-29 17:15:00) [11]

Ответ нашел тут:
http://www.relib.com/forums/topic.asp?id=813427

Про LongString понятно, но:
Если WideString передаеся, как указатель на первый симол в строке и PWideChar - тоже указатель на первый символ, то в чем разница между ними? :)
Во всех WinAPI-шных функциях(например, Windows.pas) используется PWideChar...


Наверх

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