Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизПро DLL и строки. Найти похожие ветки
← →
Vovan#1 (2006-09-15 22:27) [0]Вопрос такой.
Есть ли проблемы с памятью при передаче строк в функции и процедуры DLL?
Есть ли какие-то особенности при использовании ShortString как возвращающегося значения и можно ли просто использовать тип, вроде TMyString = String[20]?
← →
Palladin © (2006-09-15 22:31) [1]
> Есть ли какие-то особенности при использовании ShortString
> как возвращающегося значения и можно ли просто использовать
> тип, вроде TMyString = String[20]?
1 Нет
2 Да
> Есть ли проблемы с памятью при передаче строк в функции
> и процедуры DLL?
Будут, если не укажешь в приложении и библиотеке первым используемым модулем ShareMem.
← →
zamtmn © (2006-09-15 23:09) [2]http://delphimaster.net/view/2-1157920671/
← →
Vovan#1 (2006-09-15 23:32) [3]>http://delphimaster.net/view/2-1157920671/
Везде говорится о проблемы передачи строки из DLL в программу (и по той ссылке тоже). Я же хотел уточнить, распространяется ли это дело и на обратную операцию.
← →
zamtmn © (2006-09-15 23:39) [4]да, распространяется
← →
Германн © (2006-09-16 00:32) [5]
> Везде говорится о проблемы передачи строки из DLL в программу
> (и по той ссылке тоже). Я же хотел уточнить, распространяется
> ли это дело и на обратную операцию.
Направление передачи не имеет значения. Но все проблемы связаны именно с "длинными строками" - тип AnsiString и тип String в Д2 и выше при включенной опции компиллятора {$H+}.
Если ограничишься типом ShortString проблем не будет.
Опять же если и программа и dll написаны в Дельфи, то и тут проблем не будет, если вдумчиво прочитаешь комментарий, который Дельфи вставляет в заготовку библиотеки и выполнишь всё, что там сказано.
И последнее. Если программа или длл скомпиллированы продуктами разных производителей, то проблемы будут при использовании и AnsiString и ShortString!
В этом случае лучше обратить свой взор на тип PChar.
← →
zamtmn © (2006-09-16 00:43) [6]>>В этом случае лучше обратить свой взор на тип PChar
в этом случае следует обратить взор на тип который заявлен в объявлении импортируемой процедуры
← →
Германн © (2006-09-16 01:05) [7]
> zamtmn © (16.09.06 00:43) [6]
>
> >>В этом случае лучше обратить свой взор на тип PChar
> в этом случае следует обратить взор на тип который заявлен
> в объявлении импортируемой процедуры
>
По сабжу да. А по моему контексту PChar.
← →
Vovan#1 (2006-09-16 12:48) [8]Чтоб вас...
Вопрос:
>Есть ли какие-то особенности при использовании ShortString как возвращающегося значения
Правильный ответ:
ДА, ЕСТЬ. Когда добавляешь stdcall, то не работает.
Рубрика же "Начинающим".
← →
Германн © (2006-09-16 16:11) [9]
> Правильный ответ:
> ДА, ЕСТЬ. Когда добавляешь stdcall, то не работает.
>
Неужели не работает?
Правильный вопрос: Что такое stdcall?
Вот так и надо было спрашивать, а не мутить воду короткими строками!
← →
Vovan#1 (2006-09-16 16:32) [10]>Правильный вопрос: Что такое stdcall?
Вот так и надо было спрашивать, а не мутить воду короткими строками!
Никакой он не правильный. Спросил именно то, что хотел - какие проблемы с ShortString? Сказали - никаких. Это должно было означать, что никаких с stdcall и без него.
Всё это значит, что и на вопросы в "Начинающим" надо уметь отвечать, а не делать, как в [1], показывая, что мне делают услугу, поэтому довольствуйся брошенными фразами.
← →
Германн © (2006-09-16 16:55) [11]
> Спросил именно то, что хотел - какие проблемы с ShortString?
> Сказали - никаких. Это должно было означать, что никаких
> с stdcall и без него.
И какие же у тебя проблемы с ShortString при stdcall?
← →
Vovan#1 (2006-09-16 19:09) [12]>И какие же у тебя проблемы с ShortString при stdcall?
А вы ещё не знаете?
library TestDLL;
uses
SysUtils, Classes;
{$R *.res}
function SomeFunct(Str: ShortString): ShortString;
begin
Result := Str + " added";
end;
exports
SomeFunct;
begin
end.
unit unitTest;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TformTest = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
formTest: TformTest;
function SomeFunct(Str: ShortString): ShortString; stdcall; external "testdll.dll";
implementation
{$R *.dfm}
procedure TformTest.FormCreate(Sender: TObject);
begin
Caption := SomeFunct("Test");
end;
end.
========> Access Violation
← →
DrPass © (2006-09-16 19:53) [13]
> Vovan#1 (16.09.06 19:09) [12]
Боюсь, в твоем примере виноват все-таки не stdcall, а невнимательность его автора :)
← →
Vovan#1 (2006-09-16 20:01) [14]>Боюсь, в твоем примере виноват все-таки не stdcall, а невнимательность его автора :)
Почему же невнимательность лечится удалением stdcall"а?
← →
Dmitrij_K (2006-09-16 20:09) [15]
> в твоем примере виноват все-таки не stdcall, а невнимательность
> его автора :)
чуешь разницу?library TestDLL;
uses
SysUtils, Classes;
{$R *.res}
function SomeFunct(Str: ShortString): ShortString; stdcall;
begin
Result := Str + " added";
end;
exports
SomeFunct;
begin
end.
← →
zamtmn © (2006-09-16 20:21) [16]>>Почему же невнимательность лечится удалением stdcall"а?
также она лечится и добавлением stdcall"а.
соглпшения о вызове процедуры должны быть одинаковыми в exe и dll
← →
Vovan#1 (2006-09-16 21:00) [17]Спасибо, всё ясно стало. Снимаю обвинения с [1].
Delphi suxx, статьи про DLL suxx, LMD
← →
zamtmn © (2006-09-16 21:08) [18]basic рулез?
← →
Anatoly Podgoretsky © (2006-09-16 21:17) [19]Вопрос а кто не suxx?
И кто LMD?
← →
Vovan#1 (2006-09-16 21:31) [20]А почему должен быть кто-то не suxx? Ну вот ешё раз. Delphi не умеет сравнивать записи - это раз. Компилятор явно бажный, о чём я писал (
http://delphimaster.net/view/2-1157920671/ ). Работа с DLL никакая и главное, что в справке нифига не найти. На calling conventions даёт материал про Visual C++, хотя я то программирую на Delphi и VC++ вообще не установлена. В общем, сам не рад, что начал эту бадягу с Delphi.
LMD - самокритика, чтобы [1] было не обидно.
← →
Джо © (2006-09-16 21:38) [21]Да, типичный LMD. Читать не умеем, на разъяснения огрызаемся, зато виноваты, как всегда, Билл Гейтс и дядя Борланд.
← →
Vovan#1 (2006-09-16 21:41) [22]>Да, типичный LMD. Читать не умеем, на разъяснения огрызаемся, зато виноваты, как всегда, Билл Гейтс и дядя Борланд.
По-подробнее можно? А то не всё понятно.
← →
zamtmn © (2006-09-16 21:46) [23]>>Работа с DLL никакая и главное, что в справке нифига не найти
dll это не delphi, это win32, работа с ними кстати такаяже как в VC
прежде чем всё саксить, удели побольше внимания LMD:)
← →
Vovan#1 (2006-09-16 21:54) [24]>dll это не delphi, это win32, работа с ними кстати такаяже как в VC
[12] откомпилится и в VC???
← →
Dmitrij_K (2006-09-16 22:44) [25]Перепиши [12] для любого компилятора и попробуй запустить EXE.
Как думаешь что получится?
> Компилятор явно бажный
к кривых руках да
← →
zamtmn © (2006-09-16 23:32) [26]в [12] работой с dll не пахнет.
Vovan#1, читай учебники
← →
Vovan#1 (2006-09-17 00:29) [27]В кривых руках Борланда бажный компилятор - вообще зверь.
Учебники по Delphi - уже смешно.
← →
zamtmn © (2006-09-17 00:40) [28]>Vovan#1
интересно, какие тебе попадались не "кривые" компиляторы?
← →
Германн © (2006-09-17 01:28) [29]2м zamtmn © (17.09.06 00:40) [28]
> интересно, какие тебе попадались не "кривые" компиляторы?
Имхо, в "кривых руках", растущих не из того места, да ещё и при привычке "расстопыривать пальцы", всё "бажное", кроме "самого его любимого"!
Не трать время на него.
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.046 c