Frage zu einem DLL Problem/ Windows-DLL ansprechen

Flati

Grünschnabel
Erstmal an alle netten und Hilfsbereiten User hier im Forum ein fröhliches Hallo.

Da ich absolut fast keine Ahnung von C++ habe hoffe ich das ich hier richtig bin und mir schnell geholfen werden kann. Ich muß im Rahmen meiner Diplomarbeit von Java aus eine DLL ansprechen. Wie das von Java ausgeht (JNI) das hab ich inzwischen herausbekommen und auch praktisch gelöst. Mein Problem ist ich muss in der DLL welche ich von Java aus anspreche auch andere DLL's ansprechen können welche ich nicht selber erstellt habe. Kann mir jemand sagen wie ich eine DLL, optimalerweise sollte dies eine sein welche ich auch auf meinen System habe, von C++ aus ansprechen kann? Eventuell das CD-Rom Laufwerk/Systemzeit ausgeben damit ich auch merke das das Programm wirklich funktioniert. Ich weiß das es wohl mit der Funktion __stdcall funktioniert, aber das war es auch schon.

Ich habe leider nur den freien C++ Compiler von Borland (BCC55). Mein Betriebssystem ist Windows XP Home Edition, falls dies irgendwie von belang sein sollte.

Es wäre also nett wenn mir jemand hier den Quellcode zum ansprechen irgendeiner Windows-DLL reinstellen kann. Da ich mit Notepad arbeite sollten da bitte keine Syntaxfehler drin sein, sonst suche ich mir einen Wolf. Ich werde diesen dann in meinen C++ Quellcode(die DLL welche ich erzeuge um mit Java zu arbeiten) mit einbauen und testen.
 
Das Grundprinzip ist LoadLibrary und mit dem Handle dann GetProcAddress aufrufen.
Und den Funktionspointer, den du von GetProcAddress zurückbekommst, musst du dann mit diesen fürchterlich hässlichen Funktionsdeklarationen casten. Hier ein Beispiel:

Code:
  HINSTANCE   m_hinstCurrentRenderer;

  // ..schnippelschnappel.. 

  m_hinstCurrentRenderer = LoadLibrary( szFileName );
  if ( m_hinstCurrentRenderer )
  {
    // das nächste ist eine Funktionsdefinition für eine Funktion, die einen XRenderer*-Pointer zurückgibt, und keine Parameter hat. Der Typ heisst tIFunction
    typedef XRenderer* (*tIFunction)( void );

    // Hier wird der Funktionspointer gecastet und einer Variablen zugewiesen
    tIFunction    fGetInterface = (tIFunction)GetProcAddress( m_hinstCurrentRenderer, "GetInterface" );

    // der Aufruf könnte so aussehen:
    XRenderer*  pRenderer = fGetInterface();
  }

Am Ende natürlich ein FreeLibrary mit dem Instance-Handle aufrufen, ist ja nicht Java hier.
 
Aja Danke, das ist ja mächtig kompliziert. Ist das jetzt nur das Prinzip, oder funktioniert der von dir geschriebene Quellcode? Was macht eigentlich die dll szFileName? Findet der Compiler die so ohne weiteres oder muss man da noch einen Pfad angeben?

was muss man da eigentlich noch für includes mit einbinden? Ich habe nur ganz wenig Kenntnise was C/C++ angeht.
Windows.h?
 
Das ist ein Schnipsel aus meinem Code, der funktioniert, allerdings ist der Teil in einer Funktion.
szFileName ist ein const char*-Parameter, der den Filenamen der DLL enthält (Vorzugsweise den kompletten Pfad).
windows.h sollte dafür vollkommen ausreichen.

Noch ein Hinweis: Wichtig ist, das die Parameter- und Rückgabewert-Typen vollkommen übereinstimmen, sonst gibt's Abstürze.
 

Neue Beiträge

Zurück