| Autor |
Beitrag |
Niko S.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Fr 16.01.09 18:04
also
ich habe jetzt diese funktion
www.delphi-forum.de/...ebergeben_89433.html
in eine DLL eingebaut und wollte sie jetzt aufrufen dabei krieg ich einen zugriffverletzungs fehler
ich habe mich bei den DLL's an dieses Tutorial gehalten
www.delphi-treff.de/...tpascal/dlls/page/1/
Die funktion ist die selbe geblieben allerdings halt in der dll
Quelltext 1: 2: 3: 4: 5: 6: 7:
| --------------------------- Itemedit --------------------------- Zugriffsverletzung bei Adresse 0014F95D in Modul 'itemdblib.dll'. Lesen von Adresse 00000000. --------------------------- OK --------------------------- |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure LoadItemDB(db: TStringList; var MyItem2: TMyItem);stdcall;
implementation
{$R *.dfm}
uses Unit2,Unit3;
procedure LoadItemDB(db: TStringList; var MyItem2: TMyItem);stdcall; external 'dlls\itemdblib.dll'; |
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:
| library itemdblib;
uses SysUtils, Classes;
{$R *.res}
type TMyItem = array[0..999999] of array[0..22] of String;
procedure LoadItemDB(db: TStringList; var MyItem2: TMyItem); var i,id: Integer; str: String; q: Integer; begin for i := 0 to db.Count - 1 do begin if (Pos('//',db.Strings[i]) = 0) AND (db.Strings[i] <> '') then begin str := db.Strings[i]; id := StrToInt(Copy(str,0,Pos(',',str)-1)); Myitem2[id,0] := IntToStr(id); for q := 1 to 18 do begin str := Copy(str,Pos(',',str)+1,length(str)); Myitem2[id,q] := Copy(str,0,Pos(',',str)-1); end; str := Copy(str,pos('{',str)+1,length(str)); MyItem2[id,19] := Copy(str,0,Pos('}',str)-1); str := Copy(str,pos('{',str)+1,length(str)); MyItem2[id,20] := Copy(str,0,Pos('}',str)-1); str := Copy(str,pos('{',str)+1,length(str)); MyItem2[id,21] := Copy(str,0,Pos('}',str)-1); MyItem2[id,22] := 's'; end; end; end;
exports LoadItemDB;
begin end. | Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Sa 17.01.2009 um 12:31
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 16.01.09 18:12
Den Kommentar in Deiner DLL hast Du aber gelesen, oder?
|
|
Niko S. 
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Fr 16.01.09 18:43
ja klar ... hab ich jetzt auch berichtig aber ist immernoch das selbe also ich habe jetzt "ShareMem" eingetragen in der Application und in der DLL. die dll ist auch mitbei aber trozdem funktioniert das nicht oder muss ich die BORLNDMM.dll auch noch extra als external angeben?
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 16.01.09 18:46
Das 2. Problem könnte sein, dass die Verwendung von Delphi-Klassen (TStringlist) in DLLs nicht funktionieren soll (ich habe da keine Erfahrungswerte, hab das nur irgendwo gelesen).
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Fr 16.01.09 18:52
ich komme bei der Zeile
Delphi-Quelltext 1:
| external 'dlls\itemdblib.dll'; |
etwas ins grübeln. Pfadangaben ????
weiterhin; ist überhaupt die Stringlist initialisiert?
:-)msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Niko S. 
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Fr 16.01.09 19:11
also die dll findet er so mit der pfad angabe das ist kein problem =)
und die string list ist zumindest in der appli. inizialisiert und auch vorhanden !
scheint nur die übergabe geht nicht so ganz ... sollt ich vllt die zeilen von der stringlist in eine array machen? also ich werds mal probieren und editieren obs geht ...
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Fr 16.01.09 19:14
poste doch mal den Aufruf der Funktion
:-)Msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Niko S. 
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Fr 16.01.09 19:42
Delphi-Quelltext 1: 2: 3: 4:
| db := TStringList.Create; db.LoadFromFile('db.txt'); LoadItemDB(db,MyItems); db.free; |
EDIT:
Myitem2[id,0] := IntToStr(id);
das ist die zeile die den zugriffsfehler verursacht ! O:
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Sa 17.01.09 10:57
Mal anzeigen lassen, welchen Wert ID hat?
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 17.01.09 11:03
Niko S. hat folgendes geschrieben : |
LoadItemDB(db,MyItems);
Myitem2[id,0] := IntToStr(id);
|
was ist das?
:-)Msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Niko S. 
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Sa 17.01.09 11:42
Ja also der ID wert ist korrekt =) der ist innerhalb der angegebenen grenze
Delphi-Quelltext 1: 2:
| type TMyItem = array[0..999999] of array[0..22] of String; |
Das ist TMyItem (MyItem & MyItem2) (obwohl beides MyItem heißen könnte seh ich grad x_X
Mir ist gerade aufgefallen, als ich das ganze statt in einer DLL in eine extra Unit reingepackt habe, dass er mir
obwohl gleicher Typendeklarierung die Fehlermeldung bringt:
| Zitat: |
[Pascal Fehler] Unit1.pas(108): E2010 Inkompatible Typen: 'LibDB.TMyItem' und 'Unit1.TMyItem' |
und wenn ich das weiterhin als "var" übergebe also die array bzw den Typ TMyItem
| Zitat: |
[Pascal Fehler] Unit1.pas(108): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen |
Obwohl bei beiden die Typdefinierung gleich ist ?!
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 17.01.09 13:12
Schreibe die Typdeklaration in eine extra Unit und binde diese in DLL und Anwendung ein.
|
|
Niko S. 
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Sa 17.01.09 14:22
naja zwischen dll & appli übergibt er es ja bzw sollte er zumindest... ich habs versucht mit nem pointer also dass ich im prinzip bloß einer variabel von gleichen typ bei der übergabe die adresse zuweise aber irgendwie hab ich das auch nicht hingekriegt ich komme bei den pointern immer und immer wieder durcheinander ;<
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 17.01.09 15:43
2 Typdeklarationen = 2 unterschiedliche Typen, so sieht Delphi das zumindest.
|
|
Niko S. 
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Sa 17.01.09 21:49
// Edit
Ich korregiere .. es funktioniert auch nicht wenn ich die in eine Unit schreibe und in die Uses eintrage ich krieg immernoch sobalt ich aus dem array was ich als var übergebe etwas auslesen oder etwas einschreiben will einen zugriffsfehler =/
|
|