Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача параметров из DLL и в нее 
:(
    Опции темы
vanexe1
Дата 12.2.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



Здравствуйте!

Тут код основной программы  которая вызывает 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 так и из нее может есть примеры, но я уже все просмотрел, может я что-то пропускаю или недопонимаю, помогите. 
Заранее благодарен. 


Это сообщение отредактировал(а) vanexe1 - 12.2.2009, 11:13
PM MAIL   Вверх
skyboy
Дата 12.2.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



может, я что-то подзабыл, но как мне помнится, 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.

PM MAIL   Вверх
vanexe1
Дата 12.2.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



Хех даже самому смешно стало что это так просто! Но не чего четыре дня были потрачены не напрасно.
PM MAIL   Вверх
ziga
Дата 12.2.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 25.4.2007

Репутация: 1
Всего: 1



незнаю то это или нет но можно и так:

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 при закрытии программы нормально выгружается? не выдаёт ошибок с чтением памяти?

Это сообщение отредактировал(а) ziga - 12.2.2009, 13:51
PM MAIL   Вверх
X-Vlad
Дата 12.2.2009, 14:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 570
Регистрация: 10.4.2002
Где: Украина, Львов

Репутация: 1
Всего: 5



незабудь когда будешь туда сюда ганять стринговые параметры  - подключить "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. 



--------------------
Хорошая штука - комп..:)
www.x-vlad.com
PM MAIL WWW ICQ   Вверх
skyboy
Дата 12.2.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



FastMM вкуснее. Хотя бы потому, что не надо тягать за собой borlandmm.dll(или как там его).
и, насколько мне известно из интернетов, FastMM включен в состав библиотек BDS, начиная с версии 2006
PM MAIL   Вверх
vanexe1
Дата 12.2.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



ziga
Цитата

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

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

X-Vlad
Цитата

незабудь когда будешь туда сюда ганять стринговые параметры  - подключить "ShareMem"
 
Думаю не имеет смысла так как я буду юзать Pchar а для преобразования можно использовать StrPas. или я не правильно думаю.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0762 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.