![]() |
Fehler, wenn Procedure aus DLL ausgeführt wird, sonst nicht
Hallo Community,
Ich habe hier eine Procedure, die ich aus einer eigenen DLL ausführe:
Code:
Wenn ich diese Procedure beim OnClose-Ereignis ausführe, erscheint eine Fehlermeldung...ungefähr diese: 'Access Violation at Address [...], Write of Address [...]'. Nachdem ich die Procedure in mein Programm eingefügt und diese von dort aus ausgeführt hatte, erhielt ich keine Fehlermeldung mehr.
procedure SavePLS(Filename: String; Listbox:TListbox; PathList:TStringList);
external 'DLL_Name.dll'; [...] Procedure SavePLS(Filename: String; Listbox:TListbox; Pathlist:TStringList); Const NumItems = 'NumberOfEntries'; Section = 'Playlist'; var sav:TiniFile; i,Total:Integer; F:TextFile; Buffer:String; begin if not DirectoryExists(ExtractFilePath(FileName)) then exit; if ExtractFileExt(FileName)='.pls' then begin sav:=TiniFile.Create(Filename); try Total:=Pathlist.Count; if Total>0 then begin sav.WriteInteger(Section,NumItems,Total); sav.WriteInteger(Section,'Version',2); for i:=0 to Total-1 do begin sav.WriteString(Section,'File'+IntToStr(i+1),Pathlist.Strings[i]); sav.WriteString(Section,'Title'+IntToStr(i+1),Listbox.Items.Strings[i]); //Ini.WriteInteger(Section,'Length' + IntToStr(i+1),Integer(FTime.Objects[i])); end; end; finally sav.Free; end; end; if ExtractFileExt(FileName)='.m3u' then begin try AssignFile(F,Filename); Rewrite(F); Writeln(F,'#EXTM3U'); for i:=0 to PathList.Count-1 do begin Buffer:=Format('#EXTINF:%d,%s',[-1 {Time},PathList.Strings[i]]); WriteLn(F,Buffer); WriteLn(F,Listbox.Items.Strings[i]); end; finally CloseFile(F); end; end; end; Könnt Ihr mir helfen, das Problem zu verstehen bzw. zu lösen? mfg Nogge |
Re: Fehler, wenn Procedure aus DLL ausgeführt wird, sonst ni
hi,
der Fehler liegt dort, dass du als Übergabe-Parameter einen String hast. Für Strings musst du eine zusätzliche Unit (ShareLib oder so) von Borland einbinden. Mach es deshalb lieber mit einem PChar oder Array of Char. cu, stefan2005 |
Re: Fehler, wenn Procedure aus DLL ausgeführt wird, sonst ni
d.h ich sollte so deklarieren: FileName: PChar ? Hab ich gerade gemacht, nur kommt der selbe Fehler schon wieder.
|
Re: Fehler, wenn Procedure aus DLL ausgeführt wird, sonst ni
Dann versuche es folgendermaßen:
füge Deiner Anwendung die Unit 'ShareMem' hinzu und liefere mit dem Programm die BORLNDMM.DLL mit aus.
Delphi-Quellcode:
Viele Grüße
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss 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 übergeben. Das gilt für alle Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL. Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String- Informationen als PChar- oder ShortString-Parameter übergeben. } FreeStyle |
Re: Fehler, wenn Procedure aus DLL ausgeführt wird, sonst ni
Was meinst du mit
Zitat:
Ich habe jetzt jedenfalls in der DLL und in meiner MainUnit bei "uses" ShareMem hinzugefügt, was aber in keinster Weise etwas brachte. Vllt würde mir ein kleines Beispiel von dir helfen...^^ |
Re: Fehler, wenn Procedure aus DLL ausgeführt wird, sonst ni
Zitat:
|
Re: Fehler, wenn Procedure aus DLL ausgeführt wird, sonst ni
Und was sollte ich deiner Meinung nach jetzt verändern?
|
Re: Fehler, wenn Procedure aus DLL ausgeführt wird, sonst ni
Was steht denn in der ListBox drin? Die Dateinamen? Übergib deiner Funktion lieber einen String in Form eines PChar und splitte den wieder auf. Damit wenig Fehler auftreten können, würde ich auf die Übergabe von Klassen grundsätzlich verzichten.
Ungetestet:
Delphi-Quellcode:
Aufrufen kannst du es dann so:
procedure SavePLS(FileName, S1, S2: PChar); stdcall;
// Procedure SavePLS(Filename: String; Listbox:TListbox; Pathlist:TStringList); Const NumItems = 'NumberOfEntries'; Section = 'Playlist'; var sav:TiniFile; i,Total:Integer; F:TextFile; Buffer:String; PathList: TStringList; ListBox: TStringList; begin PathList := TStringList.Create; ListBox := TStringList.Create; try PathList.CommaText := S1; ListBox.CommaText := S2; if not DirectoryExists(ExtractFilePath(FileName)) then exit; if ExtractFileExt(FileName)='.pls' then begin sav:=TiniFile.Create(Filename); try Total:=Pathlist.Count; if Total>0 then begin sav.WriteInteger(Section,NumItems,Total); sav.WriteInteger(Section,'Version',2); for i:=0 to Total-1 do begin sav.WriteString(Section,'File'+IntToStr(i+1),Pathlist.Strings[i]); // sav.WriteString(Section,'Title'+IntToStr(i+1),Listbox.Items.Strings[i]); sav.WriteString(Section,'Title'+IntToStr(i+1),Listbox.Strings[i]); end; end; finally sav.Free; end; end; if ExtractFileExt(FileName)='.m3u' then begin try AssignFile(F,Filename); Rewrite(F); Writeln(F,'#EXTM3U'); for i:=0 to PathList.Count-1 do begin Buffer:=Format('#EXTINF:%d,%s',[-1 {Time},PathList.Strings[i]]); WriteLn(F,Buffer); // WriteLn(F,Listbox.Items.Strings[i]); WriteLn(F,Listbox.Strings[i]); end; finally CloseFile(F); end; end; finally ListBox.Free; PathList.Free; end; end;
Delphi-Quellcode:
SavePLS(PChar(FileName), PChar(ListBox1.Items.CommaText), PChar(PathList.CommaText));
|
Re: Fehler, wenn Procedure aus DLL ausgeführt wird, sonst ni
Jo, Danke...So funktioniert es jetzt.
[Edit] Was bedeutet "stdcall;" hinter der Procedure? [/Edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz