Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.54 MB
Время: 0.052 c
15-1158316984
Тульский
2006-09-15 14:43
2006.10.08
Visual Prolog


2-1158845235
Пгуые
2006-09-21 17:27
2006.10.08
Может быть есть аналог mod для Extended?


3-1155125919
DelphiLexx
2006-08-09 16:18
2006.10.08
TFIBDataSet получить следующее значение поля в OnDrawColumnCell


1-1156780556
J o i n t
2006-08-28 19:55
2006.10.08
Rave Report, выборка данных


2-1158659877
Officeman
2006-09-19 13:57
2006.10.08
Странная ошибка в ListView1.Selected