![]() |
|
|
![]()
|
|
| sasha35 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Как правильно передавать unicode строки в dll (c++builder 2010)?
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
sasha35, и то и другое билдер? Самый простой вариант WideString. Комвская строка не требует общего менеджера памяти.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| sasha35 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
На сегодняшний день и приложение и Dll - Builder. Но в дальнейшем возможно Dll будут разрабатываться и не в Builder.
Не хотелось бы как раз использовать общий менеджер памяти. А может вместо WideString, использовать какой-нибудь wchar, wchar_t? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Запросто, но WideString тоже не плохой вариант. Билдер автоматически определяет строку WideString как комовский BSTR . Т.е. для другого компилятора С++ следует прототип описать как BSTR . Можно даже в заголовке написать #ifndef __BORLANDC__ #define WideString BSTR #endif Это все нужно только в том, случае если выделение памяти произошло в одном модуле а освобождение в другом. Если таких операций не будет, то wchar_t* вполне подойдет. Проблема в том, что если строка wchar_t* передается в DLL, то DLL не знает была ли она выделена в стеке или куче, если в куче, то как к ней обратиться чтобы освободить. WideString/BSTR всегда выделяется при помощи комовской кучи, поэтому освобождение памяти очевидно. Это особенно важно, когда вы возвращаете строку из функции как результат. При использовании wchar_t* я бы рекомендовал всегда указывать константность указателя. Т.е. писать const wchar_t* (LPCWSTR) . Это предостережет от попыток произвести что-то некорректное с ней. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| sasha35 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Значит Вы рекомендуете WideString.
Спасибо, за понимание |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Не забывайте, что удаление такой строки из модуля написанного не в билдере нужно производить функцией SysFreeString, а не delete[] , кроме того возможно понадобиться подключить заголовочный файл "oleauto.h". Для билдера это автоматическая строка, за памятью которой не нужно следить. Кроме того это переносимо между любыми версиями билдера которые только поддерживают WideString. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| sasha35 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Спасибо!
Это сообщение отредактировал(а) sasha35 - 2.4.2010, 12:04 |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |