Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

Про 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.046 c
2-1158260023
Vovan#1
2006-09-14 22:53
2006.10.08
Почему компилятор предупреждает?


3-1154527729
Scorpio
2006-08-02 18:08
2006.10.08
Получение номера из БД в программу


1-1155810465
GrBob
2006-08-17 14:27
2006.10.08
Variant и Int64


2-1158444935
Not
2006-09-17 02:15
2006.10.08
Как сделать систему dll-плагинов работающих на Си и Дельфи ?


2-1159108026
learner
2006-09-24 18:27
2006.10.08
Определение имен типов объектов.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский