![]() |
Re: EXE als DLL Ersatz denkbar?
Hallo!
Entschuldigt bitte meine Frage. Zuerst folgender Qouelltext:
Delphi-Quellcode:
Das hier sagt mir die Delphi Hilfe:
program Project3;
{$APPTYPE CONSOLE} uses SysUtils, SysInit, Windows; procedure Proc1; external 'Project2.exe'; function AValue: Integer; external 'Project2.exe'; procedure Ausgabe(AText: String; AValue: Integer); external 'Project2.exe'; var LibHandle: HINSTANCE; //Wo finde ich diesen Datentyp? Hier bringt der Copiler die //unten stehende Fehlermeldung! begin { TODO -oUser -cConsole Main : Hier Code einfügen } LibHandle := LoadLibrary('Projct2.exe'); GetProcAddress(LibHandle,'Ausgabe'); Ausgabe('Dieser Wert lautet: ', 100); Readln; end.
Delphi-Quellcode:
In der Windows Unit scheint der Datentyp nicht definiert zu sein.
HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName // address of filename of executable module ); Vom Compiler kriege ich folgende Fehlermeldung: [Fehler] Project3.dpr(12): Konstante oder Typenbezeichner erwartet Was soll das??? Die Hilfe sagt mir, das dert Typ HINSTANCE in der Unit System definiert ist und die wird doch eh automatisch mit eingebunden? Aufführen der System-Unit führt auch nicht zum Erfolg. Was kann ich hier machen, damit der Code funzt. Hier ist noch der Code für die Bibliothek mit den zu exportierenden Routinen:
Delphi-Quellcode:
Wenn ich das ohne LoadLibrary versuche, erhalte ich von Windows folgende Meldung:
program Project2; //Enthält die zu exportierenden Routinen. (als EXE übersetzt)
{$APPTYPE CONSOLE} uses SysUtils, SysInit, Windows; procedure Proc1; begin writeln('Aufruf der ersten Prozedur war erfolgreich!'); end; function AValue: Integer; begin Result := 4; end; procedure Ausgabe(AText: String; AValue: Integer); begin writeln(AText, AValue); end; exports Proc1, AValue, Ausgabe; begin end. "Die Datei Project3.exe ist verknüpft mit dem fehlenden Export Project2.exe Ausgabe". Deshalb gehe ich davon aus, das ich, wenn ich das mit ner EXE statt mit ner DLL machen will, unbedingt mit LoadLibrary arbeiten muss. Aber da meckert der Compiler wegen HINSTANCE mit obiger Compilermeldung. Was mache ich falsch? Weiß nicht mehr weiter. schöni |
Re: EXE als DLL Ersatz denkbar?
Zitat:
|
Re: EXE als DLL Ersatz denkbar?
Ich hab auch keinen Ansatz, oder doch, bloß funzen tut's nich.
Hier meine Bibliothek als EXE. Deshalb das Wort Pprogram, statt Library.
Delphi-Quellcode:
Und hier die Anwendung, welche die Bibliothek verwendet:
program Project2;
{$APPTYPE CONSOLE} uses SysUtils; procedure Proc1; stdcall; begin writeln('Erste Prozedur aus der Bibliothek erfolgreich aufgerufen!'); end; function AValue: Integer; stdcall; begin Result := 4; end; procedure Ausgabe(AText: String; AValue: Integer); stdcall; begin writeln(AText,AValue); end; exports Proc1 Index 1, AValue Index 2, Ausgabe Index 3; begin { TODO -oUser -cConsole Main : Hier Code einfügen } end.
Delphi-Quellcode:
Felermeldung von Windows:
program Project3;
{$APPTYPE CONSOLE} uses ShareMem, System, SysUtils, SysInit, Windows; type TFarProc = procedure(T: String; I: Integer); procedure Proc1; stdcall external 'Project2.exe' Index 1; function AValue: Integer; stdcall external 'Project2.exe' Index 2; procedure Ausgabe(AText: String; AValue: Integer); stdcall external 'Project2.exe' Index 3; var ProcHandle: FarProc; Proc: TFarProc; begin { TODO -oUser -cConsole Main : Hier Code einfügen } HINSTANCE := LoadLibrary('Projct2.exe'); ProcHandle := GetProcAddress(HINSTANCE,'Ausgabe'); Proc := TFarProc(ProcHandle); Proc('Dieser Wert lautet: ', 100); Readln; end. PROJECT3 verursachte einen Fehler durch eine ungültige Seite in Modul <Unbekannt> bei 00de:bff90777. Register: EAX=81dfba60 CS=81dfd04c EIP=bff90777 EFLGS=bff741f7 EBX=81d33e0c SS=bff7dafa ESP=81dfc048 EBP=0063ff6c ECX=bff741f7 DS=0040 ESI=00000008 FS=bff7a567 EDX=00000000 ES=81d02000 EDI=81dde84c GS=bff7a10e Bytes bei CS:EIP: Stapelwerte: Ich kann mir nicht erlklären, was ich falsch gemacht habe. Kann mir jemand helfen? schöni |
Re: EXE als DLL Ersatz denkbar?
Das ist sehr einfach, du exportierst eine Funktion mit einem Delphi-String-Parameter. Um das nutzen zu können mußt du die Unit Sharemem von Borland mit einkompilieren, sonst kann er mit den Strings nichts anfangen.
Erstell einfach mal ein DLL-Projekt, dort wird ein entsprechender Hinweis als Kommentar mit erstellt. |
Re: EXE als DLL Ersatz denkbar?
Zitat:
Wenn das alles so einfach ist, warum wird dann der entscheidende Tipp nicht einfach gepostet?
Delphi-Quellcode:
Das habe ich aus meiner aktuellen .dpr - Datei rauskopiert. Mein Fehler muß also doch noch ne andere Ursache haben! In der zu exportierenden Bibliothek ist nämlich ShareMem auch aufgeführt und zwar an erster Stelle. Werde mal ein Dll Projekt erstellen. Und versuchen, die Dll als EXE zu übersetzen, denn genau darum geht es mir. Ich brauch eine .EXE, die wie eine .dll Routinen exportieren kann.
uses
ShareMem, System, SysUtils, SysInit, Windows; schöni |
Re: EXE als DLL Ersatz denkbar?
Hallo!
Ich hab zwar noch keine Routinen exportierende EXE hingekrigt, aber ein Dll Projekt kann zumindest mal als .OBJ Datei für C oder C++ übersetzt werden. Die läßt sich bekanntlich per [$Link ...] bzw. {$L ...} Direktive in den Programmtext einbinden, womit das eigentliche Ziel, Routinen allgemein verfügbar zu machen, genauso gewährleistet wird. Ziel damit auch erreicht, Punkt! DelphiSourcer |
Re: EXE als DLL Ersatz denkbar?
Zitat:
Außerdem wird ne .EXE mit dem Schlüsselwort "PROGRAM" eingeleitet, ne .DLL dagegen mit "LIBRARY" und letzere läßt sich eben NICHT als EXE übersetzen, sondern ausschließlich als DLL. Ich habe die Unit "ShareMem eingebunden und die .EXE mit den exportierten Routinen läßt sich nicht einbinden. EXE als DLL scheint also NICHT zu funktionieren, ich kriege nämlich trotz eingebundener ShareMem-Unit die Fehlermeldung, aber mit .OBJ geht es ja auch. Da kann ich ne Unit erstellen, die diese .OBJ Datei verwendet und habe das gleiche erreicht, falls vom Compiler, für den ich die Routinen exportieren will, DLLs nicht unterstützt werden. Manchmal muss man halt bissl um die Ecke denken. Dann ergeben sich Problemlösungen auch auf unerwartete Weise. Werd mich gleich mal dranmachen. "Dumm kan man ruhig sein, man muß sich nur zu helfen wissen!" Gruß schöni |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 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