Third-Party API anspreschen

Billie

Erfahrenes Mitglied
Hellas!

Also, ich komme aus dem Java-Bereich und habe bisher nur ein paar kleine DLLs geschrieben, welche ich von Java aus über JNI aufrufe.

Jetzt habe ich das Problem, dass ich die CEN/XFS Schnittstelle ansprechen will. Hierfür habe ich ein XFS SDK heruntergeladen, welches *.lib und *.h Dateien enthält. Die fertigen DLL's werden jeweils von einem XFS-Anbieter erstellt, also im SDK gibt es eine msxfs.lib und im System32-Verzeichnis vom Endgerät eine fertige msxfs.dll.

Meine Frage, wie kann ich mit den LIB-Dateien entwickeln? Was muss ich wo einstellen? Das Verzeichnis zu den Header-Dateien habe ich in meiner Entwicklungsumgebung unter "Zusätzliche Include-Verzeichnisse" hinzugefügt.

Und warum funktioniert folgendes Laden der DLL nicht?

C:
	if(SetDllDirectory("Z:\\WINDOWS\\system32")) {
		printf("SetDllDirectory successful\n");
	} else {
		printf("SetDllDirectory failed\n");
	}
	if(hModuleXFS == NULL) {
		hModuleXFS = LoadLibraryEx("MSXFS.dll", NULL, DONT_RESOLVE_DLL_REFERENCES);
		if(hModuleXFS == NULL) {
			printf("LoadLibrary failed\n");
		}
	}

Ich hoffe ihr könnt mir weiterhelfen. Mir fehlt es im Moment noch ziemlich am ganzen C-Background, genau wie wahrscheinlich ein Java-Einsteiger Probleme mit dem Classpath von Java bekommt (früher oder später).

Besten Dank,

Billie
 
Hi.

Warum willst du denn die DLL unbedingt mit LoadLibrary(Ex) laden? Gibt es da einen Grund?

Ansonsten sollte es ausreichen gegen die .lib Datei zu linken.

Warum das Laden nicht funktioniert kann man schlecht sagen. Schau dir den Wert von GetLastError() an.

Gruß
 
Hellas!

Keine Ahnung, ich muss die Library doch zuerst laden, bevor ich darauf zugreife? Oder muss ich im Code nur eine entsprechenden vermerk machen, dass ich die Funktionen der DLL verwenden will (welcher Vermerk wäre das) ?

Auf alle Fälle bekomme ich von GetLastError() 126 zurück. Kann mir jemand evtl. gleich zeigen, wie ich mit FormatMessage einen einfachen Text zum Fehler ausgeben kann?

Und wie "linke" ich gegen die LIB-Dateien unter VC++ 2008 Express Edition? Unter Projekteigenschaften / Linker / Zusätzliche Bibliotheksverzeichnisse?

Besten Dank,
Billie
 
Hellas!

Keine Ahnung, ich muss die Library doch zuerst laden, bevor ich darauf zugreife? Oder muss ich im Code nur eine entsprechenden vermerk machen, dass ich die Funktionen der DLL verwenden will (welcher Vermerk wäre das) ?
Du mußt nur die .lib Datei beim Linken angeben. Das führt dazu das der Linker einen entsprechenden Verweis zur DLL erzeugt und beim Start automatisch die DLL lädt. (\edit: die DLL muß dann natürlich auch automatisch gefunden werden können)
Auf alle Fälle bekomme ich von GetLastError() 126 zurück.
Das ist der Fehler ERROR_MOD_NOT_FOUND. Das Modul kann also nicht gefunden werden.
Kann mir jemand evtl. gleich zeigen, wie ich mit FormatMessage einen einfachen Text zum Fehler ausgeben kann?
Schau mal im MSDN.
Und wie "linke" ich gegen die LIB-Dateien unter VC++ 2008 Express Edition? Unter Projekteigenschaften / Linker / Zusätzliche Bibliotheksverzeichnisse?
Da müßtest du das Verzeichnis angeben wo die .lib Datei liegt. Den Dateinamen selbst mußt du dann noch in Linker / Eingabe / zusätzliche Abhängigkeiten eintragen.

Gruß
 
Zuletzt bearbeitet:
Hellas!

Danke für die Antworten! Der erste Aufruf einer API Funktion hat schon funktioniert. Ich hab nur die LIB-Dateien verlinkt und schon konnte ich kompilieren.

Habe dann nachgesehen, das SDK hat auch auf meinem lokalen Rechner die DLL ins System32 Verzeichnis kopiert - deshalb wird sie wahrscheinlich gefunden.

Besten Dank,
Billie
 
Hellas!

Also, jetzt eine Frage zum Kompilieren. Ich entwickle auf meinem lokalen Rechner unter Windows XP SP2 mit VC++ 2008 Express Edition. Am Ende läuft das Ganze aber auf einem anderen Windows XP SP2 Rechner. Aber dort scheint er die kompilierte DLL nicht laden zu können.

Kann mir jemand sagen warum bzw. was fehlt?

Besten Dank,
Billie
 
Hellas!

Also, jetzt eine Frage zum Kompilieren. Ich entwickle auf meinem lokalen Rechner unter Windows XP SP2 mit VC++ 2008 Express Edition. Am Ende läuft das Ganze aber auf einem anderen Windows XP SP2 Rechner. Aber dort scheint er die kompilierte DLL nicht laden zu können.
Aha. Wie kommst du darauf? Warum "scheint" es denn so? Fehlermeldungen?

Gruß
 
Im Detail funktioniert das LoadLibrary von Java heraus nicht. Bisher habe ich alle Anwendungen in VC++ 2008 Express Edition entwickelt und anschließend mit dem GCC Compiler kompiliert, dann erst hat es auch auf einem anderen Gerät funktioniert.

Konkret die Fehlermeldung:

"Diese Anwendung konnte nicht gestartet werden, weil die Anwendungskonfiguration nicht korrekt ist".

Wird die DLL aber nicht gefunden, kommt folgende Fehlermeldung:

"no XFSTest in java.library.path"

Im GCC kompilieren funktioniert leider nicht:

Code:
gcc -mno-cygwin -IC:/Programme/Java/jdk1.5.0_13/include -IC:/Programme/Java/jdk1.5.0_13/include/win32 -I"C:/Programme/XFS Manager/XFS/SDK/INCLUDE" -L"C:/Programme/XFS Manager/XFS/SDK/LIB" -lmsxfs -lxfs_conf -lxfs_supp -Wl,--add-stdcall-alias -shared -o Z:/XFSTest/XFSTest.dll C:/XFSTest/XFSTest/dllmain.c

und Fehlermeldung:

Code:
/cygdrive/c/DOKUME~1/rpri236/LOKALE~1/Temp/ccL3nnN1.o:dllmain.c:(.text+0x40): un
defined reference to `_WFSStartUp@8'
collect2: ld returned 1 exit status

Außerdem denke ich mir, die Exrpess Edition wird gewisse Limitierungen haben oder die Compiler-Version zu hoch sein etc. ?
 
Solange wie es auf dem PC läuft wo du es entwickelst reicht es doch. Du musst dann nur das entsprechend Setup erstellen welches die dll ins richtige Verzeichnis kopiert oder direkt sagen das sie in deinem Programm-Ordner liegt und dies mitliefern.
 
Hellas!

Naja, ich spreche ja mit der XFS API bestimmte Hardware-Komponente an und über diese verfügt eben nur mein Zielgerät.

Und das Problem ist ja nicht, dass die von mir erstellte DLL nicht gefunden wird. Mir ist jetzt eingefallen, evtl. gibt es einen Versionskonflikt zwischen der von mir verwendeten XFS-DLL und der auf dem Zielrechner.

Ich überprüfe das Mal am Montag. Auch werde ich eine kleine "Hallo Welt" DLL schreiben um zu sehen, ob der Compiler das Problem ist od. doch nicht.

Besten Dank voerst,
Billie
 
Zurück