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

Поиск:

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


Новичок



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

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



Всем привет!

Надо предать параметры в форму, которая находиться в dll-ке

Соб-сно вот код:

Вызывающая прога

Код

unit TestAppUnit;
interface
uses
        Windows, Messages, SysUtils, Classes, Graphics,
        Controls, Forms, Dialogs, StdCtrls;
type
        TForm1 = class(TForm)
        Button1: TButton;
        
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
        Form1: TForm1;
   Np, No : integer;  
   Nm:string;    
   SumN, SumT:real; 

   ShowForm:function(Np, No : integer;Nm:string;SumN, SumT:real) : Integer; LibHandle: Thandle;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
   Np:=104567;
   No:=4;
   Nm:='Mke';
   SumN:=34567.45;
   SumT:=2345.20;
   
   @ShowForm:=nil;
   LibHandle:=LoadLibrary('dllforms.dll');
   if LibHandle >= 32 then
                        begin
    @ShowForm := GetProcAddress(LibHandle,'ShowForm');

     if @ShowForm <> nil then
        ShowForm(Np, No, Nm, SumN, SumT);
                        end
                        else exit;

   FreeLibrary(LibHandle);

end;
end.



Вот код dll-ки

Код

library DllForms;

uses
  SysUtils, Forms,
  Classes,
  DllFormUnit in 'DllFormUnit.pas' {DllForm};

{$R *.res}

function ShowForm (Np, No :integer; Nm:string; SumN, SumT:real) : Integer; stdcall;
var
        Form : TDLLForm;
begin
        Form := TDLLForm.Create(Application);
        try
        Form.Projnom.Text:=IntToStr(Np);
        Form.SelectNumOff.Text:=IntToStr(No);
        Form.SelectMen.Text:=Nm;
        Form.Edit3.Text:=FloatToStr(SumN);
        Form.Edit2.Text:=FloatToStr(SumT);
        Result := Form.ShowModal;
        finally
        Form.Free;
        end;
end;
        exports
ShowForm; 

begin
end.


При нажатии на кнопку в вызывающей форме, параметры описанные константами должны передаться в поля формы.
В результате вылетает "Access violation...."
Понимаю, что где-то не прав..... но где?
хелп
PM MAIL   Вверх
Romikgy
Дата 22.12.2005, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



наверное в этой строке

Цитата(budg @ 22.12.2005, 13:58)
Form := TDLLForm.Create(Application);

откуда длл знает об твоем приложении?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Quadr0
Дата 22.12.2005, 15:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 02:54
  Вверх
budg
Дата 22.12.2005, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Romikgy @ 22.12.2005, 15:40)
наверное в этой строке

Цитата(budg @ 22.12.2005, )
Form := TDLLForm.Create(Application);

откуда длл знает об твоем приложении?

Э-э-э, а как же? Форму-то создавать надо... тем более, что без передачи параметров все нормальненько smile ,
формочка высвечивается.
Проблема появилась как только параметры начал передавать... smile

Один раз как-то сработало, но в полях формы было совсем не то, что надо...

PM MAIL   Вверх
Quadr0
Дата 22.12.2005, 15:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 02:54
  Вверх
Romikgy
Дата 22.12.2005, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(budg @ 22.12.2005, 13:58)
function ShowForm (Np, No :integer; Nm:string; SumN, SumT:real) : Integer; stdcall;

мож стринг сбивает с толку замени на Pchar


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Новичок



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

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



Рекомендация с заменой кода не помогла... smile


Цитата(Quadr0 @ 22.12.2005, 15:45)
Application и в помине нет! Ты должен в свой ShowForm метод передать указатель на владельца этой формы.


Это как ?

smile
Добавлено @ 16:02
Цитата(Romikgy @ 22.12.2005, 15:54)
Цитата(budg @ 22.12.2005, 13:58)
function ShowForm (Np, No :integer; Nm:string; SumN, SumT:real) : Integer; stdcall;

мож стринг сбивает с толку замени на Pchar

Не прокатило...
PM MAIL   Вверх
Демо
Дата 22.12.2005, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



Для начала все же прочитай комментарий, который в файл .DPR записывает мастер создания DLL про ShareMem...


--------------------
    
PM MAIL ICQ Skype   Вверх
Quadr0
Дата 22.12.2005, 20:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 02:55
  Вверх
p0s0l
Дата 22.12.2005, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



У тебя функции объявлены по-разному...

Код
   ShowForm:function(Np, No : integer;Nm:string;SumN, SumT:real) : Integer;


Код
function ShowForm (Np, No :integer; Nm:string; SumN, SumT:real) : Integer; stdcall;

Добавлено @ 21:22
(либо объявляй оба раза с stdcall, либо его вообще убирай)
Добавлено @ 21:26
Ну и также, как уже было замечено, раз у тебя используются динамические строки, то нужно и в проекте и в DLL прописать в uses ShareMem...


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 22.12.2005, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



PS: еще стоит передавать в функцию Application.Handle:
Цитата(Delphi)
Note: When writing a DLL that uses VCL forms, assign the window handle of the host EXE’s main window to the DLL’s Application.HandleApplication->Handle property. This makes the DLL’s form part of the host application. Never assign to the Handle property in an EXE.

Код
function ShowForm (AppMain : THandle; Np, No :integer; Nm:string; SumN, SumT:real) : Integer;    
var    
        Form : TDLLForm;    
begin    
  Application.Handle := AppMain;
        Form := TDLLForm.Create(Application);

Код
ShowForm:function(AppMain : THandle; Np, No : integer;Nm:string;SumN, 
SumT:real) : Integer; 
...
     if @ShowForm <> nil then    
        ShowForm(Application.Handle; Np, No, Nm, SumN, SumT);    


Это сообщение отредактировал(а) p0s0l - 22.12.2005, 21:40


--------------------
С уважением, г-н Посол.
PM   Вверх
z-END
Дата 22.12.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

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



а если просто пердавать Application?!

и в dll до создания формы прописать
Код

Forms.Application := pApplication;



--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
p0s0l
Дата 22.12.2005, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Можно и так. Только еще один момент - надо запоминать текущее значение и потом восстанавливать при выгрузке DLL (DLL_PROCESS_DETACH).

Это сообщение отредактировал(а) p0s0l - 22.12.2005, 22:06


--------------------
С уважением, г-н Посол.
PM   Вверх
budg
Дата 23.12.2005, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо всем.
Пытаюсь осмыслить вышесказанное... smile

YES!!! smile

Значит так...

1. поставил ShareMem где надо
2. поменял string на PChar // на всякий случай
3. убрал stdcall

после этого уже все заработало.... smile

4. Добавил тему с "Application.Handle". Тоже работает(разумеется).
Появилось отличие в том, что при закрытии формы длл-ки, минимизируется форма вызывающей проги.
Думаю зачем мне это нужно...

счас пороюсь с DLL_PROCESS_DETACH

Это сообщение отредактировал(а) budg - 23.12.2005, 12:13
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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