Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EInvalidPointer nach Programmende (DLL wurde eingebunden) (https://www.delphipraxis.net/79017-einvalidpointer-nach-programmende-dll-wurde-eingebunden.html)

jag_the_rapper 14. Okt 2006 22:28


EInvalidPointer nach Programmende (DLL wurde eingebunden)
 
leine DLL geschrieben und ein Programm, welches die DLL anspricht. Ich übergebe einen String an die DLL und ich habe überall ShareMem als erstes in die uses-Klausel mit aufgenommen. Das Programm und die DLL funktionieren soweit, doch wenn ich mein Programm dann beende, bekomme ich diese Meldung. Ich habe aber extra darauf geachtet, in meiner DLL *.Free bei allen Sachen zu setzten. Ich habe schon gehört, dass dieser Fehler auch Anderen Leuten unter kommt, aber ich finde nirgends eine Lösung. Weiß hier jemand, was da schief läuft? Zur info, ich benutze Delphi5 und habe in meiner DLL keine GUID's und keine Com oder ActivX geschichten. Selbst wenn ich sämmtliche Logig aus der DLL auskommentiere, dann bekomme ich noch den Fehler.

ste_ett 15. Okt 2006 02:06

Re: EInvalidPointer nach Programmende (DLL wurde eingebunden
 
Statisch oder dynamisch eingebunden?
Aufrufkonventionen gesetzt?

jag_the_rapper 16. Okt 2006 13:00

Re: EInvalidPointer nach Programmende (DLL wurde eingebunden
 
Also ich habe es statisch und dynamisch probiert, aber in beiden Fällen kommt nach Programmende die Exzeption. Was die Aufrufkonventionen angeht, da bin ich mir nicht so ganz sicher! Ich fide nirgends ein ordentliches Beispiel. Immer erklären die wie man ne Dll schreibt mit Stringübergabe und bei der implementierung nehmen die ne dll-Funktion mit nem integer, was natürlich vollkommen sinnig ist!!! bei mir sieht es so aus:

in der DLL
Delphi-Quellcode:
library HelloWorld;

uses ShareMem, SysUtils, Classes, Dialogs;

procedure TextOut(AMessage : string); stdcall;
begin
  ShowMessage(AMessage);
end;

{$R *.RES}

exports
  TextOut;

begin
end.
und jetzt das eigentliche Programm
Delphi-Quellcode:
unit Unit1;

interface

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

type TForm1 = class(TForm)
       Button_ShowHelloWorld: TButton;
       procedure Button_ShowHelloWorldClick(Sender: TObject);
     end;

var Form1: TForm1;

implementation

procedure TextOut(AMessage : string); stdcall; external 'HelloWorld.dll';

{$R *.DFM}

procedure TForm1.Button_ShowHelloWorldClick(Sender: TObject);
begin
  TextOut('Hallo Welt');
  Self.Close;
end;

end.
Wo steckt mein Denkfehler???

Muetze1 16. Okt 2006 16:38

Re: EInvalidPointer nach Programmende (DLL wurde eingebunden
 
Die ShareMem muss nicht in der Unit1 als erstes in der Uses Liste sein, sondern im Delphi Projekt! Also Öffne mal die Projektverwaltung (STRG-ALT-F11) und mach einen Rechtsklick auf die Projekt-EXE darin und wähle "Quelltext anzeigen". Dort füge die ShareMem als aller erste Unit in die Uses Liste. Danach das Projekt komplett neu compilieren. Die ShareMem kann aus der Unit1 raus.

jag_the_rapper 16. Okt 2006 18:39

BIG BIG THX!!!
 
jo, das isses!!! Das ShareMem Zeugs darf nur in die dpr und in keine pas. Toll, ich habe zich Dokus gelesen und aus keiner ging das hervor. Die meinten immer, das man ShareMem immer fleißig einbinden soll (: - Wie auch immer. Dank!

Muetze1 16. Okt 2006 23:01

Re: BIG BIG THX!!!
 
Zitat:

Zitat von jag_the_rapper
Toll, ich habe zich Dokus gelesen und aus keiner ging das hervor.

Ich finde der Kommentar von Delphi welcher automatisch im DLL Projekt vermerkt ist, ist eindeutig.

Luckie 16. Okt 2006 23:06

Re: EInvalidPointer nach Programmende (DLL wurde eingebunden
 
Und falls du auf die DLL verzichten willst:
Rückgabe von Strings aus DLLs

Michael80 5. Jan 2008 21:09

Re: EInvalidPointer nach Programmende (DLL wurde eingebunden
 
Super, hat auch mir sehr weitergeholfen :)

Bernhard Geyer 5. Jan 2008 21:24

Re: EInvalidPointer nach Programmende (DLL wurde eingebunden
 
Oder FastMM als Alternative.

grenzgaenger 5. Jan 2008 22:28

Re: EInvalidPointer nach Programmende (DLL wurde eingebunden
 
also, bei mir funktioniert das...

Delphi-Quellcode:
library Project1;

uses
  sharemem, SysUtils,
  Classes, Dialogs;

{$R *.res}

procedure TextOut(AMessage : string); stdcall;
begin
  ShowMessage(AMessage);
end;

exports
  TextOut;

begin
end.
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  ShareMem,
  SysUtils;

procedure TextOut(AMessage : string); stdcall; external 'project1.dll';

begin
 TextOut('Hallo Welt');
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.
Seite 1 von 2  1 2      

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