Funktionen aus DLL in EXE einbinden

Sonstiges (nicht kategorisierbar)

Moderator: Moderatoren

Antworten
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Funktionen aus DLL in EXE einbinden

Beitrag von henxl »

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
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

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
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

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
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

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:

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
PS. Bis jetzt habe ich nur 3 Parameter gebraucht, deswegen auch nur 3 im Aufruf.
Gruß,

Andreas
VIP der XUG Osnabrück
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitrag von henxl »

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
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
Antworten