| Autor |
Beitrag |
Henry
      
Beiträge: 619
WinXP Prof. SP3
D6 Prof.
|
Verfasst: 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:
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; CloseFile(Datei); End Else Begin Showmessage('Datei existiert bereits!' + 'Bitte anderen Namen eingeben.'); End; End; |
Quellcode der DLL:
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:
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
|
Verfasst: Fr 29.02.08 21:06
*Urgs*
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 
      
Beiträge: 619
WinXP Prof. SP3
D6 Prof.
|
Verfasst: 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
|
Verfasst: Fr 29.02.08 21:31
Henry hat folgendes geschrieben: | | An die Procedure die ich exportiere wird doch ein PChar übergeben. |
Und was ist das: Datentabelle:TStringGrid;
|
|
Henry 
      
Beiträge: 619
WinXP Prof. SP3
D6 Prof.
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 619
WinXP Prof. SP3
D6 Prof.
|
Verfasst: 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
|
|
|