Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2015, 12:50   #11
GNDragonFly
Пользователь
 
Регистрация: 05.07.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
В современных версиях Delphi использование ShareMem уже спорно, поскольку у FastMM есть свой механизм разделяемых указателей. А FastMM, как известно, является системным диспетчером памяти, начиная с Delphi 2005.
Самый простой способ -- обмениваться WideString-ами, которые сами по себе межмодульны, ShareMem им не нужен (в теории).
О-о-очень спорное утверждение. Спецом форумы не штудировал. Но только что создал проект dll в Delphi XE7. Тут же в проекте автоматически появилась надпись (PS может она кочует из древнейших делфи и сейчас не актуальна, а разработчики Embasadero просто "забыли" этот текст удалить):
Цитата:
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
Переводя на человеческий, я понял:
при использовании строк в качестве параметров либо результата выполнения функции, необходимо:
1-й вариант. В самой библиотеке и в программе подключить модуль ShareMem, который "потянет" за собой ещё и BORLNDMM.dll.
2-й вариант. Использовать PChar либо ShortString.
PS В "современных" "ёмбасадеровских" делфях все строки уже по-умолчанию WideString, если их указывать как String.
GNDragonFly вне форума Ответить с цитированием
Старый 03.06.2015, 13:21   #12
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Цитата:
Сообщение от GNDragonFly Посмотреть сообщение
Тут же в проекте автоматически появилась надпись (PS может она кочует из древнейших делфи и сейчас не актуальна, а разработчики Embasadero просто "забыли" этот текст удалить)
Мне тоже так кажется. Они же штамповкой новых версий заняты, им некогда.

Цитата:
Сообщение от GNDragonFly Посмотреть сообщение
PS В "современных" "ёмбасадеровских" делфях все строки уже по-умолчанию WideString
На самом деле нет. Они UnicodeString, а это не то же самое, что WideString.
Vapaamies вне форума Ответить с цитированием
Старый 03.06.2015, 13:22   #13
GNDragonFly
Пользователь
 
Регистрация: 05.07.2012
Сообщений: 11
По умолчанию

Кстати, еще пару замечаний по приведенному в первом посте коду:
1. Зачем в uses нужен Dialogs;
2. function ExecTest(tempStr: string): string; export;
a) export - необязательно писать в конце, т.к. ниже пишется exports, а затем перечисляются функции, которые надо экспортировать, например у Вас ExecTest;
б) Лучше использовать соглашение stdcall, особенно в Вашем случае ("... проект в одной среде разработке пишу, а библиотеку в другой .."), если языки программирования разные. Подробнее читать в "Соглашении о вызове подпрограмм", например, даже на wikipedia или тут http://rsdn.ru/ARTICLE/DELPHI/DELPHI_7_05.XML
в) tempStr: string - не используется (т.к. надо писать Result:=s.Text;, о чем Вам непрозрачно намекнули), зачем ее тогда объявлять?
3. При описании объекта TStringList внутри функции у вас написано " s: STringList;", а надо s: TSringList; Как она могла откомпилироваться и сбилдиться %(
PS Введите в поисковике Delphi dll - и будет Вам счастье...

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
На самом деле нет. Они UnicodeString, а это не то же самое, что WideString.
Согласен. Хотя это уже не совсем разные типы:
Цитата:
UnicodeString
Note: In RAD Studio, string is an alias for UnicodeString.
~2^30 characters
4 bytes to 2GB
Unicode characters, 8-bit (ANSI) characters, multiuser servers and multilanguage applications

UnicodeString is the default string type.

WideString
~2^30 characters
4 bytes to 2GB
Unicode characters; multiuser servers and multilanguage applications. WideString is not supported by the Delphi mobile compilers, but is supported by the Delphi desktop compilers. Using UnicodeString is generally preferred to WideString, except for COM applications.


Note: The default string type is UnicodeString. WideString is provided to be compatible with the COM BSTR type. You should generally use UnicodeString for non-COM applications; for most purposes UnicodeString is the preferred type. The type string is an alias for UnicodeString.

Последний раз редактировалось Stilet; 03.06.2015 в 17:10.
GNDragonFly вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов в Lazarus функции из dll на C. Son Lazarus, Free Pascal, CodeTyphon 6 27.08.2013 19:24
Вызов функции dll из программы на C. 8Observer8 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 04.11.2012 23:01
Вызов функции из DLL Vegas C# (си шарп) 2 19.12.2011 00:57
Вызов функции из DLL(C#) ZverSS88 Помощь студентам 0 25.11.2010 11:27
Вызов функции из dll-ки VVVadim Общие вопросы Delphi 2 28.04.2009 10:37