Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
14-1104326972
Рамиль
2004-12-29 16:29
2005.01.16
Настройка eMule в локальной сетке


1-1104637374
antonn
2005-01-02 06:42
2005.01.16
Меню и подменю


4-1101539901
DelphiN!
2004-11-27 10:18
2005.01.16
Свойства ярлыка


1-1104161278
Darkmaster
2004-12-27 18:27
2005.01.16
OpenDialog и нескоко файлов


8-1096733091
CyberPank
2004-10-02 20:04
2005.01.16
плагин к Winamp