Autor Beitrag
Henry
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 619

WinXP Prof. SP3
D6 Prof.
BeitragVerfasst: Fr 29.02.08 20:22 
Hallo,

ich möchte einige Funktionen und Proceduren in eine DLL auslagern.
Die DLL habe ich auch erstellt und auch ohne Fehler compilieren können.

Wenn ich die Procedure aber statisch in mein Programm einbinde und sie dann zur Laufzeit aufrufe, dann wird das Programm ohne Meldung einfach beendet.
Im Compiler wird als Fehlerstelle der Aufruf der Procedure angezeigt.
Da ich auch schon einmal eine eigene DLL erstellt habe und die Funktionen aufgerufen habe, denke ich es muss mit dem Aufbau meiner Proceduren zusammenhängen.
Diesmal muss ich nämlich Komponenten übergeben um bestimmte Dinge in der Procedure damit durchzuführen.
Wenn ich die selben Proceduren in eine Unit packe und diese in meinem Programm einbinde, funktionieren sie einwandfrei.

Diese Procedure steht in einer Unit die ich in der DLL einbinde und dann im Code der DLL aufrufe:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
Procedure SaveXLS(Datentabelle:TStringGrid;Pfad,Dateiname:String);
VAR Datei     : TextFile;
    i         : Integer;
Begin
 Dateiname := Inputbox('Dateiname',
                     'Bitte Namen für die Datendatei eingeben:','Seriendaten');
 If not FileExists(Pfad + Dateiname + '.xls') then
  Begin

   AssignFile(Datei, Pfad + Dateiname +'.xls');
    {$i-}Rewrite(Datei);{$i-}

    Write(Datei,Datentabelle.Cells[0,0] + #9);
    Write(Datei,Datentabelle.Cells[1,0] + #9);
    Write(Datei,Datentabelle.Cells[2,0] + #9);
    Write(Datei,Datentabelle.Cells[3,0] + #9);
    Writeln(Datei,Datentabelle.Cells[4,0] + #9);

   For i := 1 to Datentabelle.RowCount - 1 Do
    Begin
     Write(Datei,Datentabelle.Cells[0,i] + #9);
     Write(Datei,Datentabelle.Cells[1,i] + #9);
     Write(Datei,Datentabelle.Cells[2,i] + #9);
     Write(Datei,Datentabelle.Cells[3,i] + #9);
     Writeln(Datei,Datentabelle.Cells[4,i] + #9);

    End;//For
   CloseFile(Datei);
  End
   Else
    Begin
     Showmessage('Datei existiert bereits!' +
                 'Bitte anderen Namen eingeben.');
    End; //Else
End;


Quellcode der DLL:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
library Ri195;
...

Procedure SaveXLS(Datentabelle:TStringGrid;Pfad,Dateiname:PChar);
Begin
 SaveXLS(Datentabelle,PChar(Pfad),PChar(Dateiname));
End;


Exports
 SaveXLS;


Unit im Programm zum statischen einbinden der DLL:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
unit DLL_Import;

interface

USES Windows, SysUtils, Classes, Graphics, Controls,Dialogs,
     IniFiles, jpeg, FileCtrl, StdCtrls, ExtCtrls, Grids ;


Procedure SaveXLS(Datentabelle:TStringGrid;Pfad,Dateiname:PChar); stdcall;

implementation

 Procedure SaveXLS(Datentabelle:TStringGrid;Pfad,Dateiname:PChar);
             stdcall; external 'Ri195.dll';
end.


So sieht also meine Einbindung un Procedure aus die das Problem hervorruft. Weitere ähnliche Funktionen erzeigen das selbe Problem. Ich habe mir diese als Beispiel herausgesucht, da ich denke es hat irgendwie etwas mit der Übergabe der Komponenten zu tun.

Kann mir jemand sagen wo ich den Fehler mache? Oder ist es sogar überhaupt nicht möglich Komponenten auf diese weise an eine DLL zu übergeben?
Damit möchte ich das Programm durch austausch der DLL an verschiedene gegebenheiten anpassen.

Danke schon einmal im voraus für dei Hilfe.

_________________
mfg Henry
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 29.02.08 21:06 
*Urgs*

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
library Ri195;  
...  

 
Procedure SaveXLS(Datentabelle:TStringGrid;Pfad,Dateiname:PChar);  
Begin  
 SaveXLS(Datentabelle,PChar(Pfad),PChar(Dateiname));  
End;


Du übergibst ein Objekt an deine DLL, das dürfte genauso schief gehen, als wie wenn du einen String übergibst. Es sei denn du bindest im Programmcode und im DLL-Code den Borland Memory Manager ShareMem oder einen alternativen Memory Manager ein. Es wäre auch nicht falsch gewesen den ellenlangen Kommentar zu lesen, den Delphi rzeugt, wenn man ein neues DLL-Projekt beginnt.
Henry Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 619

WinXP Prof. SP3
D6 Prof.
BeitragVerfasst: Fr 29.02.08 21:18 
Hallo Michael,

das habe ich schon gelesen. An die Procedure die ich exportiere wird doch ein PChar übergeben. Muss ich auch intern mit PChar arbeiten in der DLL?

Gibt es denn eine Lösund für mein Problem mit der Übergabe der Komkponenten?

_________________
mfg Henry
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 29.02.08 21:31 
user profile iconHenry hat folgendes geschrieben:
An die Procedure die ich exportiere wird doch ein PChar übergeben.

Und was ist das: Datentabelle:TStringGrid;
Henry Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 619

WinXP Prof. SP3
D6 Prof.
BeitragVerfasst: Fr 29.02.08 21:39 
Stimmt, da sind letztendlich Strings drin.
Dann habe ich vermutlich ein Problem, das sich nicht lösen lässt, denn es bedarf ja sicher einer Lizenz wenn die BORLANDMM.dll verwendet werden soll und mit dem Projekt mitgegeben werden muss.

_________________
mfg Henry
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 29.02.08 22:26 
Siehe Lizenz-Datei zu dieser DLL: Die Weitergabe dieser DLL ist problemlos möglich, wenn der Autor des Programms eine Delphi-Lizenz hat UND diese DLL unverändert blablabla ist ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Henry Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 619

WinXP Prof. SP3
D6 Prof.
BeitragVerfasst: Fr 29.02.08 22:42 
Das hört sich ja gut an.
Ich habe leider noch nicht den Speicherort gefunden, wo die DLL bzw. die Lizenz dazu liegt.
Auch das einbinden von von ShareMem hat leider das Problem nicht beheben können, aber ich werde es auf jeden Fall weiter versuchen. Es muss ja machbar sein.

_________________
mfg Henry