Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Внизdll – string… Найти похожие ветки
← →
Muskat (2003-06-10 12:25) [0]Почему нельзя использовать тип String в библиотеках dll, и что будет если я пойду против этих правил…
Заранее благодарен.
← →
DmS (2003-06-10 12:28) [1]будут глюки
все дело в унификации типов данных ... чтобы dll можно было использовать и в сях и в дельфи и т.д. и наоборот :)
← →
VAleksey (2003-06-10 12:53) [2]Это где ты нашел такие правила ;-) ?
← →
DrPass (2003-06-10 13:01) [3]Просто строки в Delphi являют собой довольно сложные объекты, управлять которыми должен борландовский менеджер памяти. Если ты в dll и в exe прописал uses sharemem - то ради бога, используй.
← →
Юрий Федоров (2003-06-10 13:09) [4]По большому счету, использовать борландовский менеджер памяти нужно тогда, когда ты выделяешь память в exe, а освобождаешь в Dll (или наоборот).
Пр работе со строками операции выделения \ освобождения памяти выполняет компилятор, отсюда и вывод
← →
Юрий Зотов (2003-06-10 13:14) [5]> Muskat
Создайте новую DLL. В ее начале Delphi вставит подробный комментарий. Прочтите его, а дополнительно прочтите еще топик ShareMem в справке. И сразу все станет ясно.
← →
HolyGlory (2003-06-10 13:35) [6]А кто сказал, что в DLL нельзя String использовать? Я всю свою жизнь использовал и не имел проблем. String НЕЛЬЗЯ ПЕРЕДОВАТЬ В КАЧЕСТВЕ ПАРАМЕТРОВ ЭКСПОРТИРУЕМЫХ ФУНКЦИЙ - это, кстати, касается не только DLL, а использовать их тебе никто не запрещает - DLL - тот же exe"шник.
← →
АлексейК (2003-06-10 14:50) [7]>String НЕЛЬЗЯ ПЕРЕДОВАТЬ В КАЧЕСТВЕ ПАРАМЕТРОВ ЭКСПОРТИРУЕМЫХ ФУНКЦИЙ
Очень даже можно, если DLL использовать только для подключения в Delphi приложения. Но если объявляется просто String, в определенный момент будет вылетать Access Vioaltion (честно говоря ShareMem не спасает), если же объявить String[x], то все нормально.
← →
Muskat (2003-06-10 14:55) [8]То есть, если эту dll я буду использовать только в своем приложении, написанном на Delphi, тогда ошибки не будет?
И еще, а как насчет TStringList в качестве параметров экспортируемых функций?
← →
АлексейК (2003-06-10 15:07) [9]> То есть, если эту dll я буду использовать только в своем приложении, написанном на Delphi, тогда ошибки не будет?
Если корректно, то небудет. Хотя лучше использовать pChar например.
>И еще, а как насчет TStringList в качестве параметров экспортируемых функций?
Если версии Dephi на котором создается dll и на котором пишется приложение совпадают, то как входящий параметер подойдет, я например TAdoConnection передаю, нда, а вот если возвратить надо созданный в dll объект, то может возникнуть проблема. Хотя опять же, если обращатся к виртуальным методам этого объекта, то ошибки быть не должно.
← →
HolyGlory (2003-06-10 15:35) [10]
> Очень даже можно, если DLL использовать только для подключения
> в Delphi приложения.
НЕЛЬЗЯ
Но если объявляется просто String,
> в определенный момент будет вылетать Access Vioaltion (честно
> говоря ShareMem не спасает), если же объявить String[x],
> то все нормально.
Когда ты объявляешь String[x] - это равносильно объявлению ShortString (Например, нельзя объявить x:String[6666]). ShortString передавать никто не запрещал.
> То есть, если эту dll я буду использовать только в своем
> приложении, написанном на Delphi, тогда ошибки не будет?
Будет
> И еще, а как насчет TStringList в качестве параметров экспортируемых
> функций?
Объекты тоже передавать нельзя :(
> > То есть, если эту dll я буду использовать только в своем
> приложении, написанном на Delphi, тогда ошибки не будет?
> Если корректно, то небудет. Хотя лучше использовать pChar
> например.
Как корректно? Строки можно передовать только в ShortString и в PChar.
> Если версии Dephi на котором создается dll и на котором
> пишется приложение совпадают, то как входящий параметер
> подойдет, я например TAdoConnection передаю, нда, а вот
> если возвратить надо созданный в dll объект, то может возникнуть
> проблема. Хотя опять же, если обращатся к виртуальным методам
> этого объекта, то ошибки быть не должно.
rtfm
← →
HolyGlory (2003-06-10 15:44) [11]Вот цитаты из хэлпа:
(Это так, для граммотности)
String types can be mixed in assignments and expressions; the compiler automatically performs required conversions. But strings passed by reference to a function or procedure (as var and out parameters) must be of the appropriate type. Strings can be explicitly cast to a different string type (see Typecasts).
The reserved word string functions like a generic type identifier. For example,
var S: string;
creates a variable S that holds a string. In the default {$H+} state, the compiler interprets string (when it appears without a bracketed number after it) as AnsiString. Use the {$H-} directive to turn string into ShortString.
А вот еще:
A ShortString is 0 to 255 characters long. While the length of a ShortString can change dynamically, its memory is a statically allocated 256 bytes; the first byte stores the length of the string, and the remaining 255 bytes are available for characters. If S is a ShortString variable, Ord(S[0]), like Length(S), returns the length of S; assigning a value to S[0], like calling SetLength, changes the length of S. ShortString is maintained for backward compatibility only.
The Delphi language supports short-string types--in effect, subtypes of ShortString--whose maximum length is anywhere from 0 to 255 characters. These are denoted by a bracketed numeral appended to the reserved word string. For example,
var MyString: string[100];
creates a variable called MyString whose maximum length is 100 characters. This is equivalent to the declarations
type CString = string[100];
var MyString: CString;
Variables declared in this way allocate only as much memory as the type requires--that is, the specified maximum length plus one byte. In our example, MyString uses 101 bytes, as compared to 256 bytes for a variable of the predefined ShortString type.
Это и должно все объяснить.
А вот цитата, которая выползает при создании DLL:
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.
← →
АлексейК (2003-06-11 05:16) [12]>HolyGlory
Ну и где сказано что String использовать нельзя? Английским языком написано, прописывай ShareMem в приложении и DLL, а также поставляй с программой BORLNDMM.DLL и используй string. Я не призываю использовать string, но сделать это можно, так же как и передать объект в качестве параметра. А то что можно обращатся к виртуальным методам объекта созданного в DLL из приложения проверено на практике.
Вообще же на экспорт объектов из DLL есть четыре основных ограничения:
1. Вызывающие приложение может использовать лишь те методы объекта, ктороые были объявлены как виртуальные.
2. Экземпляры объетктов должны создаваться только внутри DLL.
3. Экспортируемый объект должен быть определен как в DLL, так и вызывающем приложении с помощью методов, определенных в том же порядке.
4. Из объекта, содержащего внутри DLL, нельзя создать объект-потомок.
← →
Muskat (2003-06-11 13:59) [13]А куда нужно копировать BORLNDMM.DLL в системную папку, или туда где находится сама dll?
И есть ли использование BORLNDMM плохой тон? Какие тут есть недостатки?
Заранее благодарен.
← →
Palladin (2003-06-11 14:09) [14]1 в любую папку указанную в переменной окружения path
2 недостатки? :) да никаких в принципе, только если таскать за собой все время borlndmm... и не возможность использовать твоим приложением dll написаныъ на сях и не возможность использования прложениями написаными на сях твоих dll
← →
DrPass (2003-06-11 14:09) [15]Или в системную папку (лучше всего), или там, где прога и dll. А плохим тоном это не является. Просто программа становится на один файл больше.
← →
Muskat (2003-06-11 23:11) [16]Я создал новое приложение, добавил в uses ShareMem, запустил программу, а после закрытия вылетает Runtime Error...
И это без всяких dll, новое приложение...
Чего он?
← →
panov (2003-06-11 23:21) [17]Таскать с собой Borlndmm.dll ненакладно, так как размер егог всего 25к.
При использовании ShareMem можно совершенно безболезненно использовать длинные строки в DLL.
Самое лучшее - добавить в файл проекта .DPR и в проект DLL
uses
ShareMem,... (Оюязательно первым модулем в uses)
Я сам сопротивлялся тому, чтобы использовать BorlndMM.dll сначала, но теперь даже нисколько не сомневаюст в пользе этой библиотеки.
Очень даже приятно работать в этом случае.
Причем тестировал в собственных разработках с интенсивным использованием строк в DLL:
http://home.ural.ru/~panov
← →
Muskat (2003-06-12 00:17) [18]
> Muskat (11.06.03 23:11)
Я создал новое приложение, добавил в uses ShareMem, запустил программу, а после закрытия вылетает Runtime Error...
И это без всяких dll, новое приложение...
Чего он?
← →
Muskat (2003-06-12 00:33) [19]А, все спасибо всем, разобрался...
← →
HolyGlory (2003-06-12 12:38) [20]
> АлексейК (11.06.03 05:16)
> >HolyGlory
> Ну и где сказано что String использовать нельзя? Английским
> языком написано, прописывай ShareMem в приложении и DLL,
> а также поставляй с программой BORLNDMM.DLL и используй
> string. Я не призываю использовать string, но сделать это
> можно, так же как и передать объект в качестве параметра.
> А то что можно обращатся к виртуальным методам объекта созданного
> в DLL из приложения проверено на практике.
> Вообще же на экспорт объектов из DLL есть четыре основных
> ограничения:
> 1. Вызывающие приложение может использовать лишь те методы
> объекта, ктороые были объявлены как виртуальные.
> 2. Экземпляры объетктов должны создаваться только внутри
> DLL.
> 3. Экспортируемый объект должен быть определен как в DLL,
> так и вызывающем приложении с помощью методов, определенных
> в том же порядке.
> 4. Из объекта, содержащего внутри DLL, нельзя создать объект-потомок.
>
А если у клиента ShareMEM нету ? Я имел ввиду без дополнительных наворотов. Я просто поянснял человеку его глюк. А Sharemem я никогда использовать не собираюсь.
← →
panov (2003-06-12 13:09) [21]>HolyGlory (12.06.03 12:38)
А если у клиента ShareMEM нету ? Я имел ввиду без дополнительных наворотов. Я просто поянснял человеку его глюк. А Sharemem я никогда использовать не собираюсь.
А зачем клиенту ShareMem нужен?
Достаточно BorlndMM.dll размером всего 25к.
А использовать или нет - дело вкуса. К тому же возможность спокойно работать со строками в DLL - очень приятная вещь.
Единственное, что надо быть более гибким в вопросах пристрастий и исходить из пользы или вреда от своих пристрастий.
← →
HolyGlory (2003-06-12 13:11) [22]
> А зачем клиенту ShareMem нужен?
Я имел ввиду BorlndMM.dll :)
> А использовать или нет - дело вкуса.
А вот здесь ты прав. Так что не будем спорить.
← →
Johny B. (2003-06-13 21:43) [23]что-то не видел, чтобы кто-либо сказал, что String не имеет фиксированного размера (в отличии от ShortString: String[255])... собственно поэтому его и нельзя передавать как параметр экспортируемой функции, ну а если использовать стринг, то, ну конечно же, нужен bor...dll, который этим делом и рулит.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.028 c