You are not logged in.

  • Login

1

Tuesday, November 7th 2006, 9:49pm

DLL in eine C Applikation einbinden

Hi,

ich würde gerne eine DLL Datei in eine C Applikation einbinden, jedoch weiß ich nicht so recht wie, obwohl ich theoretisch eine Ahnung habe, da ich dies anderen Sprachen bereits getan habe.

Die DLL will ich dann später extrahieren oder wenn möglich sogar als Modul verwenden.

Würde mich sehr über eine hoffentlich hilfreiche Antwort freuen.


Vielen Dank
zl0h

2

Tuesday, November 7th 2006, 11:59pm

Hallo,
im Regelfall musst du die mitgelieferte Headerdatei einbinden und die lib mitlinken.
Was du mit Dll extrahieren meinst kann ich nicht so ganz nachvollziehen.
Was genau möchtest du denn machen?

Gruß void

3

Wednesday, November 8th 2006, 12:14am

Das Programm benötigt die DLL, die zur Zeit im gleichen Ordner ist.

Nun würde ich diese DLL gerne mit einbinden und sie dann vom Programm aus extrahieren (in den gleichen Ordner schreiben) oder sie sogar als Modul benutzen.



Habe soeben erfolglos folgendes getestet:


In \res\:
datei.dll
main.rc


Inhalt main.rc:

C Quellcode

1
1001 BIN "res\\datei.dll"



In main.c:

C Quellcode

1
2
3
4
5
6
7
8
9
#define IDR_DLL 1001
 
(...)
 
int main(int argc, char *argv[]) {
 
ExtractRes("datei.dll",IDR_DLL);
 
(...)

und

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char ExtractRes(char *szDest, WORD wResName)
{
	FILE* hResFile;
	HRSRC hResLoad;
	HGLOBAL hResData;
	LPCSTR lpResData;
	char szFinalPath[MAX_PATH];
 
	hResFile = fopen(szDest,"wb");
	hResLoad = FindResource(NULL,MAKEINTRESOURCE(wResName),"BIN");
	hResData = LoadResource(NULL,hResLoad);
	lpResData = (LPCSTR)LockResource(hResData);
	if(hResLoad != NULL && hResData != NULL && lpResData != NULL)
	{
		fwrite(lpResData,1,SizeofResource(NULL,hResLoad),hResFile);
		fclose(hResFile);
		FreeResource(hResData);
	}
	return(0);
}



Error:
main.c:177: error: conflicting types for 'ExtractRes'
main.c:25: error: previous implicit declaration of 'ExtractRes' was here








Edit:

Und wenn ich in Dev-C++ bei "Project Options" -> "Makefile" -> "Include the following files into the MakeFile" die Datei auswähle, bekomme ich folgenden Error:

2 ...\res\datei.dll *** missing separator. Stop.

4

Wednesday, November 8th 2006, 12:52am

Ah ja,du möchtest also eine dynamisch geladene Bibliothek statisch linken.
Auf die Idee bin ich bislang noch überhaupt nicht gekommen.
Was bewegt dich denn dazu?
Unterm Strich wirst du damit wohl auch nicht viel Glück haben.
Das Prinzip ist folgendes. In deiner exe ist ne Importtabelle wo aufgelistet ist welche Funktionen aus welchen Dll´s benötigt werden.Beim Programmstart(und das ist lange bevor deine main anläuft) werden diese Dll´s in den Adressraum deiner Anwendung eingeblendet und die Dll Mains der Dlls ausgeführt.
Zumindest mir ist kein Weg bekannt wie du Windows mitteilen könntest dass deine Dll in deinen Resourcen schlummert.
Sofern es die Bibliothek auch als statische Lib gibt,kannst du diese statisch linken.
Das ist dann so ziemlich genau das was du vorhast.
Der Microsoft Linker bietet weiterhin ne Option DELAYLOAD mit der man ne exe so hinbiegen kann dass eine Dll erst dann geladen wird wenn zum ersten mal ne Funktion aus dieser aufgerufen wird.Keine Ahnung wie dass bei deinem Compiler aussieht...

Gruß void

5

Thursday, November 9th 2006, 9:51am

Also das Programm lädt die sich im gleichen Verzeichnis befindende DLL im Moment so:

C Quellcode

1
2
3
HINSTANCE   hLib;
(...)
hLib = LoadLibrary("DATEI.DLL");


Jedoch hätte ich diese DLL gerne von vornherein in dem Programm selbst.

6

Thursday, November 9th 2006, 3:03pm

Habe sie nun per Byte Array Header mit drin.

Habe nur noch Probleme beim Laden der DLL aus der Memory, siehe http://www.joachim-bauch.de/tutorials/load_dll_memory.html/en/view

Social bookmarks