AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zugriffsverletzung beim Aufrufen einer eigenen DLL

Zugriffsverletzung beim Aufrufen einer eigenen DLL

Ein Thema von Thomas233 · begonnen am 20. Nov 2004 · letzter Beitrag vom 31. Aug 2005
Antwort Antwort
Seite 1 von 2  1 2   
Thomas233

Registriert seit: 20. Feb 2004
Ort: Villach
66 Beiträge
 
Delphi 2005 Personal
 
#1

Zugriffsverletzung beim Aufrufen einer eigenen DLL

  Alt 20. Nov 2004, 17:43
Hallo,

ich habe ein Problem beim Verwenden meiner selbst geschrieben DLL in meinen Programm, und zwar handelt es sich um eine Zugriffsverletzung die beim Aufrufen einer Prozedur aus einer DLL entsteht.

Die Dll wird statisch ins Programm eingebunden. Sie parst eine Datei welche auf der Fesplatte vorhanden ist.

Ich habe DLLs bisher immer gemieden da ich immer dieses Zugriffsverletzungs-Problem mit jeder DLL die ich erstellt hatte gehabt habe.

Irgendwo scheine ich da immer einen Fehler zu machen obwohl ich nach einem Dll-Tutorial, welches ich bei Delphi-Source.de fand, vorgehe.

Wenn ich den Quellcode direkt in mein Programm einbinde (also nicht in die Dll auslagere sondern in eine Unit des Programmes) dann gibts keine Probleme, es kann also nur an der Dll selbst liegen !
Es ist auch egal welche Aufrufkonvention ich verwende, es kommt immer wieder eine Zugriffsverletzung.

Delphi-Quellcode:
// Quellcode der Dll
library gui;

uses
  SysUtils,
  Classes,
  d3d_sprite_gui in '..\..\..\d3d_sprite_gui.pas',
  d3d_input in '..\..\..\d3d_input.pas',
  dxhelp in '..\..\..\dxhelp.pas',
  d3dx9 in '..\..\..\d3dx9.pas',
  Direct3D9 in '..\..\..\Direct3D9.pas',
  DirectInput9 in '..\..\..\DirectInput9.pas',
  dxerr9 in '..\..\..\dxerr9.pas',
  DXFile in '..\..\..\DXFile.pas',
  d3d_sprite_textout in '..\..\..\d3d_sprite_textout.pas',
  d3d_sprite in '..\..\..\d3d_sprite.pas',
  uTools in '..\..\..\uTools.pas',
  StrUtils;

var CurPos:integer=-1;
    Sl:TStringlist;
    GuiDev:TD3DGui;
    EndPosofproc:integer;

{$R *.res}

procedure Gui_Add_Cmd(str:string);
begin
//...
end;

procedure Gui_Set_Cmd(str:string);
begin
//...
end;

procedure Gui_Cmd;
var i:integer;
begin
//...
end;

procedure Proc_Cmd(findproc:Shortstring);
var i:integer;
begin
//...
end;

procedure ParseGuiFromFile(_Gui:TD3DGui;filename:ShortString;menu:ShortString); pascal;
begin
GuiDev:=_Gui;
Sl:=TStringlist.Create;
Sl.LoadFromFile(filename);

Proc_Cmd(menu);

Sl.Free;
end;

exports
  ParseGuiFromFile;

begin

end.
Delphi-Quellcode:
//Deklaration
procedure ParseGuiFromFile(_Gui:TD3DGui;filename:ShortString;menu:ShortString); pascal;
//Implementierung
procedure ParseGuiFromFile(_Gui:TD3DGui;filename:ShortString;menu:ShortString); pascal; external 'data\dlls\gui.dll';
//Aufruf
ParseGuiFromFile(Gui,'data\scripts\gui\gui1.whs','GuiMainMenu');
Ich bin echt ratlos und so schön langsam fange ich an den ganzen Dll-Kram zu hassen

Wäre echt nett wenn einer mir einen Tipp zur Vermeidung des Problems geben könnte

Vielen Dank im Vorraus !

Liebe Grüße,
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: Zugriffsverletzung beim Aufrufen einer eigenen DLL

  Alt 20. Nov 2004, 19:23
Du verwendest Strings, also musst du die Unit ShareMem sowohl in der DLL als auch im Programm als erstes einbinden.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#3

Re: Zugriffsverletzung beim Aufrufen einer eigenen DLL

  Alt 20. Nov 2004, 19:41
verwende alternativ PChar, um dir das mitgeben der dll zu ersparen!
  Mit Zitat antworten Zitat
Thomas233

Registriert seit: 20. Feb 2004
Ort: Villach
66 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Zugriffsverletzung beim Aufrufen einer eigenen DLL

  Alt 20. Nov 2004, 21:11
Hallo,

laut dem Dll-Experten kann auch ShortString statt eines normalen Strings verwendet werden um die Verwendung von Sharemem zu verhindern.

Nun habe ich alle ShortString-Übergabeparameter gegen PChar-Übergabeparameter ausgetauscht, geholfen hat es aber leider nichts


Liebe Grüße,
Thomas
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#5

Re: Zugriffsverletzung beim Aufrufen einer eigenen DLL

  Alt 29. Jul 2005, 21:22
Kannst du mal versuchen TD3DGui als var zu übergeben. Also quasi zu forcieren, daß der Pointer übergeben wird (alternativ const).

Wenn das nicht funktioniert, müßtest du bitte mal die DLL und die EXE anhängen. Dann würde ich mir das im Debugger mal anschauen.
  Mit Zitat antworten Zitat
Reinhold

Registriert seit: 29. Jul 2005
Ort: Frankfurt am Main
23 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Zugriffsverletzung beim Aufrufen einer eigenen DLL

  Alt 29. Jul 2005, 23:19
Hallo Thomas,

Versuchs mal mit stdcall und nicht mit pascal.

Delphi-Quellcode:
// DLL
procedure ParseGuiFromFile(_Gui:TD3DGui;filename:ShortString;menu:ShortString); stdcall;

// Im Programm
// Interface
procedure ParseGuiFromFile(_Gui:TD3DGui;filename:ShortString;menu:ShortString); stdcall;
// Implementation
const
  DllName = 'data\dlls\gui.dll';

procedure ParseGuiFromFile; external DllName Name 'ParseGuiFromFile';
mfg
Reinhold
Reinhold
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#7

Re: Zugriffsverletzung beim Aufrufen einer eigenen DLL

  Alt 30. Jul 2005, 00:00
Zitat von Reinhold:
Versuchs mal mit stdcall und nicht mit pascal.
Sollte doch keinen Unterschied machen, da er ja sowohl DLL als auch Programm schreibt. Und relevant ist nur, daß die gleichen Aufrufkonventionen an beiden Stellen benutzt werden.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.459 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: Zugriffsverletzung beim Aufrufen einer eigenen DLL

  Alt 30. Jul 2005, 10:29
pascal ist aber veraltet. Es wurde unter Win16 benutzt, aber dann durch stdcall bei der Win32API ersetzt (sind aber kompatibel, trotzdem sollte man sie nicht mischen).
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

Re: Zugriffsverletzung beim Aufrufen einer eigenen DLL

  Alt 30. Jul 2005, 12:25
Zitat von jbg:
pascal ist aber veraltet. Es wurde unter Win16 benutzt, aber dann durch stdcall bei der Win32API ersetzt (sind aber kompatibel, trotzdem sollte man sie nicht mischen).
Das ist leider nicht korrekt. Die beiden sind nicht kompatibel. Schau mal unter Delphi-Referenz durchsuchenCalling conventions nach.
Code:
Directive Param order   Clean-up  Passes parameters in registers?
--------- -----------    --------   -------------------------------
register Left-to-right Routine   Yes
[color=red]pascal   [b]Left-to-right[/b] Routine   No[/color]
cdecl    Right-to-left Caller    No
[color=red]stdcall  [b]Right-to-left[/b] Routine   No[/color]
safecall Right-to-left Routine   No
Ich glaube du verwechselst hier jenes PASCAL (ein Präprozessor-Define in C), welches identisch ist mit dem jetzigen WINAPI (#define WINAPI __stdcall). Hat allerdings nichts mit den gleichnamigen Aufrufkonventionen in Delphi gemein. PASCAL wurde tatsächlich unter Windows 16bit benutzt.

Die Hauptsache ist eben, sie nicht zu mischen, wie ich oben ja schon schrieb. Macht der Fragesteller aber nicht, daher sollte irrelevant sein, welche er benutzt. Zumal dies bei einer DLL die mglw. nie in einem anderen Programm wiederverwendet wird (immerhin wird ein Objektzeiger übergeben!) sowieso irrelevant ist (man muß also nicht krampfhaft stdcall benutzen).
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Zugriffsverletzung beim Aufrufen einer eigenen DLL

  Alt 30. Jul 2005, 12:30
zudem ist die standardaufruf-convention "Register" und nicht "pascal"
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf