Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.031 c
1-1104230829
BFG9k
2004-12-28 13:47
2005.01.16
Отрисовка одной ячейки в StringGrid


3-1102939925
Aleksandr.
2004-12-13 15:12
2005.01.16
Как совместить файловые форматы ADO и ClientDataSet?


4-1101554372
maddognt
2004-11-27 14:19
2005.01.16
Печать на матричном принтере из Delphi


14-1103870137
Жук
2004-12-24 09:35
2005.01.16
Сломали ?


1-1104210033
HostLookUp
2004-12-28 08:00
2005.01.16
вопрос по Listbox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский