Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Передача параметров из DLL и в нее


Автор: vanexe1 12.2.2009, 11:11
Здравствуйте!

Тут код основной программы  которая вызывает dll;
Код

var
 Handle: LongWord;
 parametr1, parametr2: PChar;
 GCI2 : procedure (parametr1, parametr2:PChar);
begin
try
Handle:=LoadLibrary(PChar(GCI));
                if Handle=0
                    then
                        begin
                            ShowMessage('Библиотек не найдена'+  'GCI');
                            Halt
                        end;
@GCI2    := GetProcAddress(Handle, 'GCI2');
                parametr1:='Привет 1';
                parametr2:='Привет2';
                GCI2(parametr1, parametr2);
finally
                FreeLibrary(Handle)
 end;
end;



DLL –ка
Код


library GCI;
uses
  SysUtils,
  dialogs,
  Classes;
{$R *.res}
procedure GCI2(parametr1, parametr2:PChar); 
begin
   ShowMessage(StrPas(parametr1));
   ShowMessage(StrPas(parametr2));
end;
 exports
 GCI2;
begin
end.


В данном случае после загрузки основной программы она передаст параметры parametr1, parametr2 в DLL  и она высветит два сообщения одно соответственно с parametr1, parametr2, которые будут равны в свою очередь parametr1:='Привет 1';  parametr2:='Привет2';
Вопрос как можно сделать так, чтобы в dll ки присвоить значения parametr1:='Привет 1';  parametr2:='Привет2';  и чтоб они были переданы соответственно в основную программу скажем также  были выведены соответствующие сообщения. 
Та есть в первом описанном случае мы передаем в DLL,  а во втором из DLL в основную прогу как это сделать?… 
В общем мне нужно научиться передавать параметры процедур как в DLL так и из нее может есть примеры, но я уже все просмотрел, может я что-то пропускаю или недопонимаю, помогите. 
Заранее благодарен. 

Автор: skyboy 12.2.2009, 11:38
может, я что-то подзабыл, но как мне помнится, var-параметры функции вполне могут и в dll использоваться:
Код

library GCI;
uses
  SysUtils,
  dialogs,
  Classes;
{$R *.res}
procedure GCI2(var parametr1, parametr2:PChar); 
begin
    ShowMessage(StrPas(parametr1));
    ShowMessage(StrPas(parametr2));
    parameter1:= 'hellooooo world!';
end;
 exports
 GCI2;
begin
end.

Автор: vanexe1 12.2.2009, 11:58
Хех даже самому смешно стало что это так просто! Но не чего четыре дня были потрачены не напрасно.

Автор: ziga 12.2.2009, 13:50
незнаю то это или нет но можно и так:

Form1

Код

var
 Handle: LongWord;
 parametr1, parametr2: PChar;
 GCI2 : procedure (parametr1, parametr2:PChar);

 f : function:string;

begin
try
Handle:=LoadLibrary(PChar(GCI));
                if Handle=0
                    then
                        begin
                            ShowMessage('Библиотек не найдена'+  'GCI');
                            Halt
                        end;
@GCI2    := GetProcAddress(Handle, 'GCI2');
                parametr1:='Привет 1';
                parametr2:='Привет2';
                GCI2(parametr1, parametr2);

@f := GetProcAddress(Handle, 'GetParam');
                parametr1 := Pchar(f);
finally
                FreeLibrary(Handle)
 end;
end;


DLL

Код

library GCI;
uses
  SysUtils,
  dialogs,
  Classes;
{$R *.res}
procedure GCI2(parametr1, parametr2:PChar); 
begin
   ShowMessage(StrPas(parametr1));
   ShowMessage(StrPas(parametr2));
end;

function GetParam:string;
begin
   result := 'bla bla bla';
end;
 exports
 GCI2;
begin
end.


В экспорте ещё надо добавить GetParam

У меня такой вопрос, у тебя DLL при закрытии программы нормально выгружается? не выдаёт ошибок с чтением памяти?

Автор: X-Vlad 12.2.2009, 14:06
незабудь когда будешь туда сюда ганять стринговые параметры  - подключить "ShareMem"

Цитата

 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. 

Автор: skyboy 12.2.2009, 14:12
http://sourceforge.net/projects/fastmm/ вкуснее. Хотя бы потому, что не надо тягать за собой borlandmm.dll(или как там его).
и, насколько мне известно из интернетов, FastMM включен в состав библиотек BDS, начиная с версии 2006

Автор: vanexe1 12.2.2009, 15:35
ziga
Цитата

У меня такой вопрос, у тебя DLL при закрытии программы нормально выгружается? не выдаёт ошибок с чтением памяти?

Не все работает отлично и правильно.

X-Vlad
Цитата

незабудь когда будешь туда сюда ганять стринговые параметры  - подключить "ShareMem"
 
Думаю не имеет смысла так как я буду юзать Pchar а для преобразования можно использовать StrPas. или я не правильно думаю.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)