![]() |
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 ![]() die .dll sieht dann folgendermaßen aus (die funktion ist hier aus der code-lib)
Delphi-Quellcode:
die aufrufende unit
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.
Delphi-Quellcode:
aufgerufen im hauptprogramm (MNetFunctions und sharemem (wenn das wichtig ist?) sind eingebunden)
unit MNetFunctions;
interface function localip():string; stdcall; implementation function localip():string; stdcall; external 'MyNetFunctions.dll'; end. 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 |
Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
Ersetze den String im Interface der Dll mal durch PChar
|
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. |
Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
Zitat:
|
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 |
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 |
Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
ShareMem war ja nur für String notwendig
|
Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
WideStrings werden intern anders verwaltet als (Ansi)Strings und benötigen deshalb diese Borland DLL nicht.
|
Re: Einfacher Funktionsaufuruf aus .dll -> Fehler
Zitat:
|
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 06:53 Uhr. |
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