Entwickler-Ecke

Dateizugriff - Fehlermeldung bei DLL-Zugriff


fishhed - Di 06.03.07 12:13
Titel: Fehlermeldung bei DLL-Zugriff
Hallo,

ich teste gerade die Abeit mit DLLs. Leider schlage ich mich mit Fehlermeldungen rum, obwohl der Aufruf der Dll scheinbar funktioniert.

Dies ist meine DLL

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
library dllPdf;

uses
  SysUtils,
  Classes;

{$R *.res}

function erzeugePdf(sName: string): stringstdcall;
begin
  Result := 'klappt';
end;

exports
  erzeugePdf;

begin
end.


Dies ist das aufrufende Programm:


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:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function erzeugePdf(sName: string): stringstdcallexternal 'dllPdf.dll';


procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(erzeugePdf('klappt es?'));
end;

end.


Wenn ich das Programm ausführe und auf Button1 klicke bekomme ich erst den String aus der DLL angezeigt(-->'klappt').
Danach bekomme ich leider folgende Fehlermeldung:

"Im Projekt Aufruf.exe ist eine Exception der Klasse EInvalidPointer mit der Meldung "Ungültige Zeigeroperation" aufgetreten! ..."

Woran liegt das?


Delete - Di 06.03.07 12:36

Hast du dir durchgelesen, was der DLL Wizzard als Kommentar ganz zu Anfang in die Datei geschrieben hat? Ansonsten: http://www.michael-puff.de/Developer/Artikel/2006_10/2006_10_07_String_DLL.shtml


fishhed - Di 06.03.07 12:41

Okay, ich glaube ich habs selber hinbekommen. Ich habe den String 'nullterminiert'.


JayEff - Di 06.03.07 13:52

user profile iconfishhed hat folgendes geschrieben:
Ich habe den String 'nullterminiert'.

Das heißt, du typecastest im Programm einen PChar und übergibst diesen der DLL, wodurch du auf FastShareMem bzw. ShareMem verzichten kannst, oder? Das selbe Problem hab ich übrigens auch mal gepostet... Suche in: Delphi-Forum, Delphi-Library SIMPELSTE DLL, mein Thread ;)