Autor |
Beitrag |
Holg_i
      
Beiträge: 79
|
Verfasst: Di 09.03.10 11:30
Hallo liebe Gemeinde,
es hört sich komisch an, ist es auch, aber ich bin mal wieder mit meinem Latein am ende.
Benutze ich folgenden Code geht alles ganz fein:
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:
| procedure TForm1.FormCreate(Sender: TObject);
var handelDLL: HINST; NDLL: PChar
begin handelDLL:=0; NDLL:=Nil; For i:=1 to ParamCount do IF LowerCase(ExtractFileExt(ParamStr(i)))='.dll' then NDLL:=PChar(ParamStr(i)); IF NDLL=Nil then NDLL:=PChar('E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll');
handelDLL := LoadLibrary(NDLL);
if handelDLL = 0 then begin MessageBox(0,'DLL nicht gefunden','kritischer Fehler',MB_OK or MB_ICONSTOP); Application.Terminate end else begin .... .... .... |
Benutze ich diese Variante:
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:
| procedure TForm1.FormCreate(Sender: TObject);
var handelDLL: HINST; NDLL: PChar
begin handelDLL:=0; NDLL:=Nil; For i:=1 to ParamCount do IF LowerCase(ExtractFileExt(ParamStr(i)))='.dll' then NDLL:=PChar(ParamStr(i)); IF NDLL=Nil then NDLL:=PChar(ExtractFilePath(Application.ExeName)+'cstkom.dll');
handelDLL := LoadLibrary(NDLL);
if handelDLL = 0 then begin MessageBox(0,'DLL nicht gefunden','kritischer Fehler',MB_OK or MB_ICONSTOP); Application.Terminate end else begin .... .... .... |
Wird die DLL auch geladen aber es führt im weiteren verlauf zu einem fehler.
Der fehler ist kein fehler das ist Fakt und wie getippt klappt es wen ich
Delphi-Quelltext 1: 2: 3:
| IF NDLL=Nil then NDLL:=PChar('E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll');
handelDLL := LoadLibrary(NDLL); |
Tippe wunderbar
nur bei:
Delphi-Quelltext 1: 2: 3:
| IF NDLL=Nil then NDLL:=PChar(ExtractFilePath(Application.ExeName)+'cstkom.dll');
handelDLL := LoadLibrary(NDLL); |
nicht.
Ich verstehe die Welt nicht mehr. Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 09.03.2010 um 10:40
|
|
Tastaro
      
Beiträge: 414
Erhaltene Danke: 23
|
Verfasst: Di 09.03.10 11:44
pchars böööse!
Ich nix mögen pchars!
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:
| procedure TForm1.FormCreate(Sender: TObject);
var handelDLL: HINST; NDLL: string;
begin handelDLL:=0; NDLL:=''; For i:=1 to ParamCount do IF LowerCase(ExtractFileExt(ParamStr(i)))='.dll' then NDLL:=ParamStr(i); IF NDLL='' then NDLL:=ExtractFilePath(Application.ExeName)+'cstkom.dll';
handelDLL := LoadLibrary(PChar(NDLL));
if handelDLL = 0 then begin MessageBox(0,'DLL nicht gefunden','kritischer Fehler',MB_OK or MB_ICONSTOP); Application.Terminate end else begin .... .... .... |
Probierst du?
|
|
Holg_i 
      
Beiträge: 79
|
Verfasst: Di 09.03.10 12:06
Ich fange an dieses Forum zu lieben. Erstmal DANKE
Klasse geht.. aber warum.
Und was nun nicht geht. Gebe ich "E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll" als parameter mit wird die DLL geladen und funktioniert und es kommt wieder zu einem fehler im ablauf.
Was ist nun der unterschied.
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:
| procedure TForm1.FormCreate(Sender: TObject);
var NDLL: String;
begin
handelDLL:=0; NDLL:=''; For i:=1 to ParamCount do IF LowerCase(ExtractFileExt(ParamStr(i)))='.dll' then NDLL:=ParamStr(i); IF NDLL='' then NDLL:=ExtractFilePath(Application.ExeName)+'cstkom.dll';
handelDLL := LoadLibrary(PChar(NDLL));
if handelDLL = 0 then begin MessageBox(0,'DLL nicht gefunden','kritischer Fehler',MB_OK or MB_ICONSTOP); Application.Terminate end else begin .... .... .... |
wenn ich es mit oder auch ohne Parameter starte ist NDLL immer gleich.
Also NDLL: 'E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll'
Bei mitgegebenen Parameter kommt es zu einer Fehlermeldung die blödsinn ist aber das Programm startet nicht bei nicht mitgegebenen Parameter läuft es. In beiden fällen wird die DLL aber richtig gelanden.
AchJa noch eben bemerkt... gebe ich als Parameter "E:\Eigene Dateien\SOURCE\Delphi 4\MDI\1.dll" mit geht es obwohl 1.dll die gleiche DLL ist nur halt unter einem andern KÜRZEREN namen.
--- Moderiert von Narses: Beiträge zusammengefasst---
Es wird immer sonderbarer.
Also der Quelltest ist
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:
| procedure TForm1.FormCreate(Sender: TObject);
var NDLL: String;
begin handelDLL:=0; NDLL:=''; For i:=1 to ParamCount do IF LowerCase(ExtractFileExt(ParamStr(i)))='.dll' then NDLL:=ParamStr(i); IF NDLL='' then NDLL:=ExtractFilePath(Application.ExeName)+'cstkom.dll';
handelDLL := LoadLibrary(PChar(NDLL));
if handelDLL = 0 then begin MessageBox(0,'DLL nicht gefunden','kritischer Fehler',MB_OK or MB_ICONSTOP); Application.Terminate end else begin .... .... .... |
Ich habe zwei DLL's die beide komplett die gleichen sind
1. E:\Eigene Dateien\SOURCE\Delphi 4\MDI\1.dll
2. E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll
wie getippt beides sind die gleichen ich habe sie nur kopiert.
A. rufe ich das Programm ohne Parameter auf so wird E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll geladen
programm läuft und macht bei beenden ein unerklärlichen fehler.
B. rufe ich das programm mit Parameter ( E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll ) auf kommt es nicht weit und bricht mit einem unerklärlichen fehler ab.
C. rufe ich das programm mit Parameter ( E:\Eigene Dateien\SOURCE\Delphi 4\MDI\1.dll ) auf geht alles super startet und beendet alles normal.
Wie getippt in allen fällen wird die DLL geladen und sie arbeitet.
Bei A. Beendet sich das Programm nicht fein.
Bei B. Startet es nicht.
Bei C. geht es richtig.
Hatt dafür einer eine erklärung?
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 09.03.10 12:36
Und warum übergibst du das Ding nicht als ein Parameter, mit "" eingeschlossen?
Naja, zum Problem: Wenn es wirklich exakt die selbe DLL ist, mag ich mal behaupten, dass dein Fehler woanders herkommt. Da du aber freundlicherweise direkt die Fehlermeldung mit angegeben hast, können wir wohl nur raten.
- Arbeitest du mit Threads oder dynamischen Arrays?
- Aktivier mal in den Projektoptionen so Sachen wir "Bereichsprüfung", erzeug das Projekt neu, und versuchs nochmal.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Holg_i 
      
Beiträge: 79
|
Verfasst: Di 09.03.10 12:47
Ich benutze dynamische Arrays.
Wie ich tippe... Die DLL sind eine Kopie... die eine cstkom.dll und die kopie 1.dll
cstkom.dll wird geladen wenn keine als Parameter mitgegeben wird ( fall A ).
gebe ich cstkom.dll als paramter mit so kommt es zum fehler ( fall B )
gebe ich 1.dll mit ( fall C ) klappt alles super.
Das dynamische Array erzeuge ich mit
SetLength(
nach dem laden der DLL weil ich die größe erst von der DLL bekomme die ich benötige.
Auch mit Bereichsprüfung passiert das gleiche.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 09.03.10 12:53
Fehlermeldung...
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Holg_i 
      
Beiträge: 79
|
Verfasst: Di 09.03.10 13:03
A. rufe ich das Programm ohne Parameter auf so wird E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll geladen
programm läuft und macht bei beenden ein unerklärlichen fehler.
B. rufe ich das programm mit Parameter ( E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll ) auf kommt es nicht weit und bricht mit einem unerklärlichen fehler ab.
C. rufe ich das programm mit Parameter ( E:\Eigene Dateien\SOURCE\Delphi 4\MDI\1.dll ) auf geht alles super startet und beendet alles normal.
Einloggen, um Attachments anzusehen!
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 09.03.10 13:12
Zu A: Deutet darauf hin, dass du auf etwas zugreifst, was es nicht gibt.. Eigentlich sollte Delphi an der Stelle stehen bleiben, wo der Fehler entsteht. Muss nicht unbedingt was mit der dll zu tun haben.
Zu B: Ähhhh.. Sicher, dass davor nicht noch eine Meldung erscheint? Ansonsten  *ratlos*
Versteh ich dich richtig, dass NDLL in Fall A als auch B identisch ist? Dann seh ich da erstmal keinen Grund, warum es mal gehen sollte, und mal nicht.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Holg_i 
      
Beiträge: 79
|
Verfasst: Di 09.03.10 13:19
Ja das siehst du richtig.
NDLL ist in Fall A wie auch im Fall B gleich ( Debug hat es mir gezeigt )
NDLL: 'E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll'
nur wir NDLL durch ein Parameter beschrieben ( Fall B ) Starte das Programm nicht. wird es erzeugt da kein Parameter mitgegeben wird ( Fall A ) geht es nur das beenden geht nicht richtig.
Wird als parameter E:\Eigene Dateien\SOURCE\Delphi 4\MDI\1.dll ( Fall C ) mitgegeben geht alles super.
Und wie getippt es sind beide die gleichen DLL's da nur kopiert.
Ich flippe hier noch aus.
Nachtrag:
Es muss mit der Länge des DLL-Names zusammenhängen.
beide DLL nun in c:\ kopieret und dort geht es in allen fällen mit allen DLL's
Aber die lösung sollte das nicht sein
|
|
Tastaro
      
Beiträge: 414
Erhaltene Danke: 23
|
Verfasst: Di 09.03.10 14:06
Meiner Ansicht nach kann es nur ein Problem mit der Speicherverwaltung sein.
Das Laden der DLL ist korrekt. U.U. liegt der Fehler in der DLL selbst. Überprüfe doch mal ob in dieser keine Probleme bei Speicherzugriffen (z.B. über Arraygrenzen hinaus) auftreten.
Beste Grüße
|
|
Holg_i 
      
Beiträge: 79
|
Verfasst: Di 09.03.10 14:22
Ich Danke auf alle fällen allen die hier Hilfeleistung geben wollen.
Die DLL ist korrekt wie getippt es sind durch kopieren zwei genau gleich DLL mit nur zwei verschiedenen namen.
Benenne ich 1.dll um in jetztaber.dll habe ich das problem benenne ich sie wieder um in 1.dll oder a.dll geht alles.
Kopiere ich cstkom.dll nach C:\ und binde sie mit ein geht auch alles lasse ich sie in E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll geht es nicht
Es muss an der Länge des Pfades+Dateinamen liegen.
Wobei mir noch nicht klar ist was an
NDLL:=ExtractFilePath(Application.ExeName)+'cstkom.dll';
und dem übegebenen Parameter
E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.dll also NDLL:=ParamStr(i);
anderst sein soll.
ich rasste echt bald aus hier... Da läuft das ganze Programm schon echt fein und nun dieser misst.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 09.03.10 14:25
@Tastaro: Da sagst du was..
In diesem Zusammenhang möchte ich mal nachfragen, ob du Strings in der DLL verwendest? Oder was für Datentypen generell zum Einsatz kommen.
Zum neuesten Post:
Soweit ich weiß kann PChar nur bis 255 Zeichen.. aber die sind ja hier bei weitem noch nicht erreicht.
Wozu ist es überhaupt notwendig, dass du per Parameter die DLL übergibst?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Holg_i 
      
Beiträge: 79
|
Verfasst: Di 09.03.10 14:35
Also folgendes. Ich habe nun folgendes gemacht.
1. die DLL's in CLL's umbenannt. Ist auch nachher für meine Anwendung recht sinnvoll.
2. CLL mit meiner Anwendung verknüpft
3. cstkom.cll im verzeichniss belassen und es auf C:\ kopiert
klicke ich nun doppelt auf E:\Eigene Dateien\SOURCE\Delphi 4\MDI\cstkom.cll so startet mein programm nicht ( keine fehlermeldung nix )
klicke ich nun doppelt auf C:\cstkom.cll so startet mein programm
klicke ich doppelt auf E:\Eigene Dateien\SOURCE\Delphi 4\MDI\1.cll so startet mein programm
klicke ich doppelt auf C:\1.cll so startet mein programm auch
starte ich mein programm direkt also ohne parameter so startet es zwar ( mit dem laden von NDLL:=ExtractFilePath(Application.ExeName)+'cstkom.cll'; ) aber bei beenden tretten fehler auf.
wie getippt 1.cll und cstkom.cll sind beides die gleichen dateien nur umbenannt.
Ach ja den Code habe ich natürlich wie folgt geändert
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:
| procedure TForm1.FormCreate(Sender: TObject);
var NDLL: String;
begin handelDLL:=0; NDLL:='';
For i:=1 to ParamCount do IF LowerCase(ExtractFileExt(ParamStr(i)))='.cll' then NDLL:=ParamStr(i); IF NDLL='' then NDLL:=ExtractFilePath(Application.ExeName)+'cstkom.cll';
handelDLL := LoadLibrary(PChar(NDLL));
if handelDLL = 0 then begin MessageBox(0,'DLL nicht gefunden','kritischer Fehler',MB_OK or MB_ICONSTOP); Application.Terminate end else begin .... ..... |
--- Moderiert von Narses: Beiträge zusammengefasst---
Xentar hat folgendes geschrieben : | ....Wozu ist es überhaupt notwendig, dass du per Parameter die DLL übergibst? |
Nun es wird mehrere DLL's geben die auf verschiedene geräte verschieden zugreifen. Die funktionen in der DLL sind alle das gleich nur das abrufen der daten ist von verschieden geräten anderst.
So brauch ich bei neuen Geräten die dazukommen sollen nur eine andere DLL ( jetzt CLL ) erstellen und in das verzeichniss kopieren.
Das Programm bleibt unverändert.
Auch ein wechseln von geräten in der Software ist so möglich. Einfach DLL ( CLL ) entladen und die neue wieder laden.
Hoffe es verständlich ausgedrückt zu haben.
|
|
Tastaro
      
Beiträge: 414
Erhaltene Danke: 23
|
Verfasst: Di 09.03.10 14:41
Holg_i hat folgendes geschrieben : |
Die DLL ist korrekt wie getippt es sind durch kopieren zwei genau gleich DLL mit nur zwei verschiedenen namen.
Benenne ich 1.dll um in jetztaber.dll habe ich das problem benenne ich sie wieder um in 1.dll oder a.dll geht alles.
|
Es grht nicht darum ob der Name der DLL korrekt ist, sondern ob deren Inhalt korrekt ist. Und daran habe ich im Moment starke Zweifel.
Solange der Code in der DLL nicht überprüft ist, kann man zum Verhalten deines Programms keine Aussagen mehr treffen.
Beste Grüße
|
|
Holg_i 
      
Beiträge: 79
|
Verfasst: Di 09.03.10 15:15
An der DLL kann es nicht liegen da es beide die gleichen dateien sind unter anderem ist die DLL nackt.
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: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122:
| library cstkom;
uses SysUtils, Classes, Windows, Messages, extctrls;
var KanalAnzahl: Integer; Einheit: String; MinSpeed: Integer; MaxSpeed: Integer; Nachkomma: Integer; Version: String; DeviceName: String; DeviceNummer: String;
function GetDLLName: String; stdcall; begin result:='DEMO'; end;
function GetEinheit: String; stdcall; begin result := Einheit; end;
function GetKanalAnzahl: integer; stdcall; begin result := KanalAnzahl; end;
function SetTimerSpeed(Speed: Integer): Integer; stdcall; begin result:=Speed; end;
function TimerStart(Wert: Boolean): Boolean; stdcall; begin result:=Wert; end;
function GetTimerSpeed: Integer; stdcall; begin result:=100; end;
function GetTimer: Boolean; stdcall; begin result:=True; end;
function GetMinSpeed: Integer; stdcall; begin result:=MinSpeed; end;
function GetMaxSpeed: Integer; stdcall; begin result:=MaxSpeed; end;
function GetNachkomma: Integer; stdcall; begin result:=Nachkomma; end;
function GetVer: String; stdcall; begin result:=Version; end;
function GetName: String; stdcall; begin result:=DeviceName; end;
function GetDevice: String; stdcall; begin result:=DeviceNummer; end;
exports GetKanalAnzahl, SetTimerSpeed, TimerStart, GetTimerSpeed, GetTimer, GetEinheit, GetMinSpeed, GetMaxSpeed, GetNachkomma, GetVer, GetName, GetDevice, GetDLLName;
begin Kanalanzahl:=9; Einheit:='mm'; MinSpeed:=1; MaxSpeed:=2000; Nachkomma:=3; Version:='V 3.08'; DeviceName:='DEMO9'; DeviceNummer:='H758BB3939'; end. |
Zuletzt bearbeitet von Holg_i am Di 09.03.10 15:21, insgesamt 1-mal bearbeitet
|
|
guinnes
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Di 09.03.10 15:20
Warum liest eigentlich keiner, was im Kopf einer DLL als Kommentar steht (bzw. ignoriert es ):
Zitat: | { Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß sich in der
ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
Strings als Parameter oder Funktionsergebnisse weitergibt. Dies trifft auf alle
Strings zu, die von oder zur DLL weitergegeben werden -- auch diejenigen, die
sich in Records oder Klassen befinden. ShareMem ist die Schnittstellen-Unit
zu BORLNDMM.DLL, der gemeinsamen Speicherverwaltung, die zusammen mit
der DLL weitergegeben werden muß. Um die Verwendung von BORLNDMM.DLL
zu vermeiden, sollten String-Informationen als PChar oder ShortString übergeben werden. } |
|
|
Holg_i 
      
Beiträge: 79
|
Verfasst: Di 09.03.10 15:26
???? Jetzt stehe ich ganz auf dem Schlauch..... Wie kann ich das nun mit meinem Problem in verbindung bringen???
|
|
guinnes
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Di 09.03.10 15:32
Ganz einfach : Du bringst die Speicherverwaltung von Delphi durcheinander.
|
|
Holg_i 
      
Beiträge: 79
|
Verfasst: Di 09.03.10 15:39
Ich könnte dir die Füsse küssen.... WO Wohnst du.... Dir ist mehr als ein Essen sicher.... meine fresse.... ist ja echt irre.... ich halte es nicht aus
ShortString
nicht String
das ding läuft.....
Das erkläre mir einer
ich bin echt hin und weg...
sche*** Internet hier kann man sich gar nicht richtig bedanken
|
|
Seniore
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 09.03.10 16:24
siehste, geht doch 
|
|