Brauche Hilfe mit DLL's!! (Laden und Zugreifen)

B

bitmaster

Hallo,

ich habe ein großes Problem mit den DynamicLinkLibrarys!!
Kann mir jemand sagen, wie man DLL's mit RunTime Linking (LoadLibrary)
benutzt?
 
Mit welcher Klassenbibliothek programmierst Du? MFC, VCL oder direkt WinAPI?
In der VCL kannst Du mit LoadLibrary() erstmal die DLL laden und das Handle der geladenen Bibliothek benutzen. Von dem Handle suchst Du dann mit GetProcAddress() die Adresse der Funktion (Funktionszeiger), die unter einem bestimmten Namen aus der DLL exportiert ist. Und schliesslich rufst Du diese Funktion dann noch auf.
Allerdings ist das Aufrufen der Funktion nicht unbedingt nötig, weil in einer DLL sowieso immer eine Standardfunktion enthalten ist, die beim Laden schon ausgeführt werden kann.
 
Eigentlich progge ich mit Assembler.
(Bis jetzt)

Naja, ich hab beim Downloaden von dem Freeware-Linker
'alink' so Beispiele gefunden, wie eine DLL oder eine Win32 Anwendung.
Nur geht es irgendwie nicht, dass ich die Funktion von der Asm-DLL
in ein C++ Programm einbinde.
 
Mit asm hab ich die DLL gecodet und arbeiten tu ich mit WinAPI.
Ich hab den BCC32(Borland C++ Builder 5)

Welchen Compiler nutzt du denn so?
 
Also wie Liron schon gesagt hat, kannst du dir mit LoadLibrary() die DLL laden, danach musst du dir nur noch einen Funktions-Pointer holen und kannst dann die Funktion ausführen.
Ein Beispiel anhand einer Funktion in der DLL, die als übergabe 2mal int hat und als Rückgabe auch einen int:
Code:
  .
  .
  .
  HINSTANCE instance;
  instance = LoadLibrary("MyDLL.dll");
  if(!instance)
    return false;

  // den funktions-pointer deklarieren
  // die funktion ist in der DLL wie folgt deklariert:
  // int MyFunc(int, int);
  int (*MyFuncPtr)(int,int);

  // die FunktionsAdresse holen:
  MyFuncPtr = (int(*)(int,int))GetProcAddress(instance,"MyFunc");
  
  // Aufruf der Funktion:
  int a,b;
  a=b=0;
  int ret = MyFuncPtr(a,b);
  
  // Freigeben der DLL:
  FreeLibrary(instance);

  .
  .
  .

So das is nur ein Beispiel und ich hoffe das das auch so einigermaßen richtig ist, is net ganz einfach ich hab das auch net getestet.

Gruss Homer
 
meine DLL sieht wie folgt aus:
Code:
#include <windows.h>

int MyFunc(int a, int b)
{
	a++;
	b++;
	return a+b;
}

int WINAPI DllMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	char szError[] = {"Test DLL."};
//	MyFunc(0, 1);
	
	return 0;
}

und die exe datei:
Code:
#include <stdio.h>
#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{

	hInstance = LoadLibrary("dll.dll");

	if(!hInstance)
	{
		MessageBox(NULL, "Couldn't get dll.dll", "Error", MB_OK | MB_ICONERROR);
		return 1;
	}

  int (*MyFuncPtr)(int,int);

  MyFuncPtr = (int(*)(int,int))GetProcAddress(hInstance,"MyFunc");

 /* if(!MyFuncPtr)
  {
	  MessageBox(NULL, "Error in DLL", "Error", MB_OK | MB_ICONERROR);
	  return 1;
  }*/
  
  int a = 1, b = 2;
  
  int ret = MyFuncPtr(a,b);

	char temp[99];
	sprintf(temp, "Die value aus der DLl ist: %i", ret);

	MessageBox(NULL, temp, "dll.dll", MB_OK | MB_ICONINFORMATION);
  
  FreeLibrary(hInstance);
	
  MessageBox(NULL, "Allright", "Allright", MB_OK | MB_ICONINFORMATION);

	return 0;
}

nun ist das problem, wenn ich den kommentar weg mach, das dann immer die message box kommt... also kann was nich stimmen.... wenn ich die kommentare da lass.... dann schmiert das programm ab... warum?
 
Wenn Du den Kommentar wegmachst, dann wird in die Verzweigung gesprungen, weil der Pointer auf die Funktion in der DLL 0 (oder ist das in C NULL?) ist. Und danach wird der weitere Code nicht mehr verarbeitet, weil beim return 1 schon Ende ist.
Wenn danach die Funktion noch weiter läuft und Du die Funktion bei der Adresse in dem Pointer aufrufst, gibt es einen Fehler, weil der Pointer irgendwo ins Nirvana zeigt und im Nirvana keine Funktion existiert, die ausgeführt werden kann.

Der Pointer zeigt wahrscheinlich nirgendwohin, weil die DLL-Funktion "MyFunc" (Gross-/Kleinschreibung beachten!) nicht in der DLL gefunden wird. Bist Du sicher, dass diese Funktion von der DLL auch wirklich exportiert wird?
 
ja, ich weiss das nach return ende ist... is auch richtig an der stelle... hab´s auskommentiert, weil ich mir nicht sicher war, was der rueckgabewert ist...

aber ich hab dir ja oben gezeigt, was in meiner DLL steht... ich seh kein export.. :)
wie exportiere ich die funktion? ich weiss wie man typen exportiert.. mehr nich :)
 
Zurück