Seite 1 von 1

Funktionen aus DLL in EXE einbinden

Verfasst: Sa, 17. Mär 2007 9:16
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

Verfasst: Sa, 17. Mär 2007 9:35
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

Verfasst: Sa, 17. Mär 2007 9:50
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

Verfasst: Mo, 19. Mär 2007 8:14
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.

Verfasst: Mo, 19. Mär 2007 12:16
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