Autor Beitrag
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: 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

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
---------------------------
Itemedit
---------------------------
Zugriffsverletzung bei Adresse 0014F95D in Modul 'itemdblib.dll'. Lesen von Adresse 00000000.
---------------------------
OK   
---------------------------


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// Aus DLL's
  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';


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:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
library itemdblib;

{ 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. }


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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Sa 17.01.2009 um 12:31
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 16.01.09 18:12 
Den Kommentar in Deiner DLL hast Du aber gelesen, oder?
Niko S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Fr 16.01.09 18:52 
ich komme bei der Zeile
ausblenden 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Fr 16.01.09 19:42 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 17.01.09 11:03 
user profile iconNiko S. hat folgendes geschrieben Zum zitierten Posting springen:

LoadItemDB(db,MyItems);


Myitem2[id,0] := IntToStr(id);



was ist das?
:-)Msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Niko S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Sa 17.01.09 11:42 
Ja also der ID wert ist korrekt =) der ist innerhalb der angegebenen grenze

ausblenden 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



BeitragVerfasst: Sa 17.01.09 13:12 
Schreibe die Typdeklaration in eine extra Unit und binde diese in DLL und Anwendung ein.
Niko S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: 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



BeitragVerfasst: Sa 17.01.09 15:43 
2 Typdeklarationen = 2 unterschiedliche Typen, so sieht Delphi das zumindest.
Niko S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: 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 =/