Autor Beitrag
alemone
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 04.03.06 21:42 
Hi!
Ich habe ein Problem, versuche in eine MidiForm eine Dll dynamisch zu laden (mit einem MidiChild). Beim Aufruf werden 2 Parameter uebergeben, einer als TApplication, der zweite eine Exit Procedure, die vom MidiChild beim FormCloseQuery aufgerufen werden soll, um in der Main App den FreeLibrary Prozess in Gang zu setzen.
Das MidiChild laedt ordentlich, beim FormCloseQuery rufe ich also die Prozedur auf und .... Error.
Hier die Programmstruktur:

Main App:
ausblenden Delphi-Quelltext
1:
2:
3:
Type
  TExitMidi=Procedure(Idx:Integer);
  TExecMidi=Procedure(Par1:TApplication;Par2:Pointer);


Sowohl in der Dll als auch im MidiChild existiert diese Erklaerung ebenfalls.

Aufruf der Dll von der Main App:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Modules1Click(Sender: TObject);
Var
  Prg:TExecMidi;
  EM:^TExitMidi;
begin
    if LHdl=0 then
    begin
      EM:=@TForm1.CloseMidi;
      LHdl:=LoadLibrary('MidiDLL');
      if LHdl<>0 then
      begin
          @Prg:=GetProcAddress(LHdl,'RunPlugin');
          if @Prg<>Nil then
            Prg(Application,EM);
          else
            ShowMessage('MidiDLL not found!');
      end;
end;
Exit Procedure in der Main:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Procedure TForm1.CloseMidi(Index:Integer);
begin
    //Variabel LHdl wird spaeter ein Array THandle sein fuer mehrere Plugins,
    //daher der Parameter Index, um die entsprechende Dll zu "entladen".
    FreeLibrary(LHdl);
end;


Prozedur in der Dll:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Procedure RunPlugin(MainApp:TApplication;ExitPrg:TExitMidi);
begin
    if not Assigned(MOwn) then //MOwn:TApplication;
    begin
        MOwn:=Application;
        Application:=MainApp;
    end;
    frm:=TmdForm.Create(MOwn.MainForm);
    frm.ExitEvent:=ExitPrg;
    frm.Show;
    //Bis hier alles ok
end;


Programmteil des MidiChild:
...
ausblenden Delphi-Quelltext
1:
2:
3:
  public
      ExitEvent:TExitMidi; //Siehe oben, hier wird die Proc uebergeben
      Idx:Integer; //fuer spaetere Arrayeinbindung der THandle in der Main


FormCloseQuery:
...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TmdForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
Var
   n:Integer;
begin
    n:=1//fuer Testzwecke, ohne Effekt
    ExitEvent(n);
    //Folgendes soll passieren: in der Main den FreeLibrary in Gang setzen
    // und in der Dll geschieht in der ExitProc:
     //frm.Free; //Resourcen freigeben
end;

Ziemlich lang alles, aber hilft vielleicht, das Problem zu loesen. Die Anwendung wird hauptsaechlich aus Plugins bestehen (weil gross und nur nach und nach fertiggestellt, eine PostGre Anwendung mit vielen Modulen!)

Kann mir jemand helfen? Bin ziemlich verzweifelt, da mir die Kenntnisse fehlen, die Ursache herauszufinden.

Danke!!

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Sa 04.03.06 22:53 
Du meinst sicherlich MDI, gell ;)

Also du musst da die Sharemen Unit als erstes(in der uses Aufzählung wirklich als erstes) bei beiden einbinden. Hier stehts nochmal detailiert: Suche in der Delphi-PRAXiS PLUGINS IN EIGENEN ANWENDUNGEN


Mal was anderes, wenn du Hilfe erwartest, dann sollte es doch kein Problem sein den Text einzurücken und als solchen zu markieren oder? Das ist so wirklich grausam, da kriegt man ja Augenkrebs ;)
alemone Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 05.03.06 12:56 
Hi digi_c!

Zunaechst danke. Habe versucht, den Text einzuruecken, ist aber irgendwie schiefgegangen.

Habe mit den Plugin Beitrag angesehen. Es besteht ein kleiner Unterschied und ich habe es nicht geschafft, die Loesung auf mein Problem zu uebertragen. Im Tutorial wird von der Main auf die Dll zugegriffen, bei mir soll's aber umgekehrt laufen. Die MDI Form soll auf eine Funktion in der Main zugreifen, die CloseMidi Funktion. Das Modul laeuft sonst autonom. Spaeter werden Pointer zur Database uebergeben, etc.
Auch mit der Einbindung der ShareMem blieb das Problem gleich (Access violation).
Das Projekt haenge ich mal an (D6). Vielleicht habe ich ja etwas (gravierendes, banales) uebersehen oder falsch gemacht (das ganz sicher).

Danke noch mal!!
Einloggen, um Attachments anzusehen!