Hallo,
ich habe eine Vielzahl von Funktionen als DLL "ausgelagert", die DLL ist ca. 6 MB groß. Die Funktionen sind alle einzeln als OBJ compiliert.
Nun möchte ich ein kleines Programm erstellen, welches einige wenige dieser Funktionen aus der DLL nutzt.
Wie kann ich es erreichen, dass in die EXE nur diese wenigen Funktionen aus der DLL eingebunden werden und die EXE zur Laufzeit ohne die DLL auskommt.
Ich möchte dazu nicht in der XPJ die einzelnen OBJ-Dateien angeben (zu aufwendig bei mehreren kleinen EXE-Projekten).
Meine Frage also: gibt es eine Möglichkeit, einzelne Funktionen aus einer DLL in eine EXE einzubinden ?
Vielleicht weiß jemand Rat ...
Grüße
Heinz
Funktionen aus DLL in EXE einbinden
Moderator: Moderatoren
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Hallo Heinz,
Du kannst das Problem mittels #INCLUDE Angaben lösen. Du gibst im Hauptprogramm (oder wo auch immer innerhalb Deiner Anwendung) diejenigen PRG-Dateien an, in denen sich der Funktionscode befindet.
z.B.:
#INCLUDE FUNC1.PRG
#INCLUDE FUNC2.PRG
Aber Achtung: Wenn Du diesen Weg wählst und Du die "externen" PRG´s nicht in Deinem Projekt-File angibst, führen Änderungen der externen PRG´s nicht zur automatischen Neu-Compilierung.
Gruß, Olaf
Du kannst das Problem mittels #INCLUDE Angaben lösen. Du gibst im Hauptprogramm (oder wo auch immer innerhalb Deiner Anwendung) diejenigen PRG-Dateien an, in denen sich der Funktionscode befindet.
z.B.:
#INCLUDE FUNC1.PRG
#INCLUDE FUNC2.PRG
Aber Achtung: Wenn Du diesen Weg wählst und Du die "externen" PRG´s nicht in Deinem Projekt-File angibst, führen Änderungen der externen PRG´s nicht zur automatischen Neu-Compilierung.
Gruß, Olaf
-
- Rekursionen-Architekt
- Beiträge: 315
- Registriert: Mo, 16. Okt 2006 13:04
- Wohnort: Region Stuttgart
Hallo Heinz,
falls du aus dem Entwicklungssystem einer anderen Sprache eine lib.exe greifbar hast, könntest du die benötigten .obj auch zu einer .lib zusammenfassen.
Das geht zum Beispiel mit lib.exe aus dem kostenlosen Visual C++ Express, das man hier herunterladen kann. (Warnung, fast 400 MB!)
Das ist auch über .xpj in den Build-Vorgang integrierbar.
Viele Grüße,
Günter
falls du aus dem Entwicklungssystem einer anderen Sprache eine lib.exe greifbar hast, könntest du die benötigten .obj auch zu einer .lib zusammenfassen.
Das geht zum Beispiel mit lib.exe aus dem kostenlosen Visual C++ Express, das man hier herunterladen kann. (Warnung, fast 400 MB!)
Das ist auch über .xpj in den Build-Vorgang integrierbar.
Viele Grüße,
Günter
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Heinz,
um das Programm ohne DLLs starten zu können, darfst du die libs nicht in deine EXE mit einkompilieren. Du kannst zum starten der Funktionen aus der DLL z.B. DllCall benutzen. Damit wird die DLL dynamisch geladen, wenn die noch nicht geladen wurde.
Ich habe es bei mir mit eigener Funktion gelöst, um die Fehler beim Aufruff abzufangen und die Routine nicht ständig zu wiederholen:
PS. Bis jetzt habe ich nur 3 Parameter gebraucht, deswegen auch nur 3 im Aufruf.
um das Programm ohne DLLs starten zu können, darfst du die libs nicht in deine EXE mit einkompilieren. Du kannst zum starten der Funktionen aus der DLL z.B. DllCall benutzen. Damit wird die DLL dynamisch geladen, wenn die noch nicht geladen wurde.
Ich habe es bei mir mit eigener Funktion gelöst, um die Fehler beim Aufruff abzufangen und die Routine nicht ständig zu wiederholen:
Code: Alles auswählen
#include "dll.ch"
**DLLCall ersetzen, um Fehler beim Aufruf abzufangen
FUNCTION MyDllCall( cDLLName, nCallingConv, cFuncName, xParam1, xParam2, xParam3 )
local xReturn
local bSaveError, oError
bSaveError := ErrorBlock()
ErrorBlock( {|e| Break(e)} )
BEGIN SEQUENCE
xReturn := DllCall( cDllName, nCallingConv , cFuncName, xParam1, xParam2, xParam3 )
RECOVER USING oError
ErrorBlock( bSaveError )
msgbox( "Fehler beim Aufruf der Funktion "+var2char(cFuncName)+" aus der DLL " + var2char(cDllName)+"!"+chr(13);
+ "Code: " + var2char(oError:osCode) + chr(13);
+ "Fehlermeldung: " + var2char(oError:description), "FEHLER" )
END SEQUENCE
ErrorBlock( bSaveError )
RETURN xReturn
Hallo,
vielen Dank für Eure Tipps.
Ich suchte nach einer Lösung, eine EXE ohne Runtimes und ohne DLLs lauffähig zu machen.
An den Tipp mit der LIB.EXE erinnere ich mich aus meinen Anfangszeiten.
Außerdem habe ich ein Programm namens StandAloneXpress gefunden.
Mal sehen, ob ich das hinbekomme ...
Grüße
Heinz
vielen Dank für Eure Tipps.
Ich suchte nach einer Lösung, eine EXE ohne Runtimes und ohne DLLs lauffähig zu machen.
An den Tipp mit der LIB.EXE erinnere ich mich aus meinen Anfangszeiten.
Außerdem habe ich ein Programm namens StandAloneXpress gefunden.
Mal sehen, ob ich das hinbekomme ...
Grüße
Heinz
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates