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 Einfacher Funktionsaufuruf aus .dll -> Fehler (https://www.delphipraxis.net/130333-einfacher-funktionsaufuruf-aus-dll-fehler.html)

craash 6. Mär 2009 14:35


Einfacher Funktionsaufuruf aus .dll -> Fehler
 
hi,

ein neuer tag ein neues problem :-D

heute konnte ich mich endlich dazu durchringen, einen versuch zu wagen, ein paar funktionen die ich oft nutze in eine .dll zu packen, bisher hatte ich da respektvollen abstand gehalten :stupid:

gesagt getan, anhand dieses dt-tutorials habe ich dann meine erste .dll erstellt, testweise bisher mit nur einer funktion.

die .dll sieht dann folgendermaßen aus (die funktion ist hier aus der code-lib)

Delphi-Quellcode:
library MyNetFunctions;

uses
  SysUtils,
  Classes,
  winsock,
  MNetFunctions in 'MNetFunctions.pas';

{$R *.RES}

///////////////////////////////////////////////////////////////////////
//////
////
//


function localip:string; stdcall; //gibt die lokale netzwerkadresse (lan) als string zurück
var
WSA : TWSAData;
ILen : integer;
PHst : PChar;
PHEn : PHostEnt;
begin
WSAStartup( $0101, WSA );
ILen := $FF;
PHst := StrAlloc( ILen );
gethostname( PHst, ILen );
PHEn := gethostbyname( PHst );

with PHEn^ do result:=format(
'%d.%d.%d.%d',
[ord(h_addr^[ 0 ]), ord(h_addr^[ 1 ]),
ord(h_addr^[ 2 ]), ord(h_addr^[ 3 ])]
);

{Nuke the string}
StrDispose( PHst );

{Dust and Clean}
WSACleanup;

end;

//
////
//////
///////////////////////////////////////////////////////////////////////


exports
       localip;

begin
end.
die aufrufende unit

Delphi-Quellcode:
unit MNetFunctions;

interface
         function localip():string; stdcall;

implementation
         function localip():string; stdcall;
         external 'MyNetFunctions.dll';

end.
aufgerufen im hauptprogramm (MNetFunctions und sharemem (wenn das wichtig ist?) sind eingebunden)
wird die funktion testweise wie folgt aufgerufen

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
showmessage(localip);
end;

das funktioniert auch alles wunderbar, beim create wird die ip angezeigt, dann allerdings gefolgt von einer "Ungültige[n] Zeigeroperation" und das Programm stürzt ab :|


könntet ihr mir evtl. auf die sprünge helfen wo mein fehler liegt? ..wäre sehr nett


mfg

mkinzler 6. Mär 2009 14:37

Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
 
Ersetze den String im Interface der Dll mal durch PChar

sirius 6. Mär 2009 14:38

Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
 
Ja, in deinem Fall ist die Sharemem extrem wichtig. Und du musst die Sharemem in beiden Projekten an erster Stelle schreiben.

@roter Kasten
einfach nur durch PChar ersetzen reicht da nicht :zwinker:

Edit2: Aber statt string--> widestring nehmen würde gehen.

mkinzler 6. Mär 2009 14:40

Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
 
Zitat:

@roter Kasten
einfach nur durch PChar ersetzen reicht da nicht Zwinkern
So war es ja gemeint

craash 6. Mär 2009 14:46

Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
 
ersetze ich das funktionsergebnis durch widestring funktioniert alles super, wenn ich das hauptprogramm aber schließe kommt wieder "ungültige zeigeroperation" :|

/edit: pchar (angepasst) führt zum selben ergebnis

craash 6. Mär 2009 15:00

Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
 
(sry wegen doppelpost)

entferne ich sharemem aus der uses-klausel läuft alles einwandfrei ....allerdings bin ich jetzt etwas verwirrt :o

mkinzler 6. Mär 2009 15:06

Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
 
ShareMem war ja nur für String notwendig

Luckie 6. Mär 2009 15:08

Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
 
WideStrings werden intern anders verwaltet als (Ansi)Strings und benötigen deshalb diese Borland DLL nicht.

sirius 6. Mär 2009 15:08

Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
 
Zitat:

Zitat von craash
entferne ich sharemem aus der uses-klausel läuft alles einwandfrei ....allerdings bin ich jetzt etwas verwirrt :o

Abgesehen, dass es nicht mehr notwendig ist, hattest du sharemem wohl nicht an erster Stelle in der Prohjektdatei (*.dpr) stehen.

craash 6. Mär 2009 15:09

Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
 
achso ok

dann bedanke ich mich für die hilfe :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz