Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   JNI gesucht (https://www.delphipraxis.net/76478-jni-gesucht.html)

Luckie 11. Sep 2006 13:37

Re: JNI gesucht
 
Ich versuche das ganze gerade zu debuggen.

Luckie 25. Sep 2006 09:51

Re: JNI gesucht
 
OK, ich bin etwas weiter gekommen. Und zwar findet er diesen Pfad "SOFTWARE\\JavaSoft\\Java Runtime Environment" wohl nicht, obwohl er genauso in der Registry steht. Das verstehe ich irgendwie nicht. Jedenfalls bekomme ich an dieser Stelle
Code:
  res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_PATH_TO_JRE, 0, KEY_READ, &key);
  printf("RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_PATH_TO_JRE, 0, KEY_READ, &key)\n");  
 
  if (res != ERROR_SUCCESS) {   
     LPTSTR pszBuf;
    pszBuf = SysErrorMessage(GetLastError(), NULL, 0);
     _tprintf(_T("%s\n"), pszBuf);
    LocalFree(pszBuf);   
    return 0;
  }
in der Funktion int getJvmDllPath(char* path) die Fehlermeldung:
Zitat:

Das System kann die angegebene Datei nicht finden.

Der_Unwissende 25. Sep 2006 10:26

Re: JNI gesucht
 
Hm, an den Leserechten solltest du ja nicht scheitern (wenn du den Schlüssel mittels Regedit siehst).
Ja, da geht's dann wieder los, den Fehler seh ich gerade nicht. Endet der Pfad mit einer \0? Sonst kann hier natürlich wieder das letzte Zeichen fehlen.
Ansonsten solltest du erstmal schauen, ob du denn einen anderen Schlüssel findest und öffnen kannst (z.B. HKEY_LOCAL_MACHINE\Software).

Was die Fehlermeldung angeht, so kenne ich jetzt die Funktion SysErrorMessage nicht, aber kommt denn das gleiche auch bei FormatMessage raus?
Code:
if (res != ERROR_SUCCESS) {   
  char[MAX_PATH] buf;
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, &buf[0], MAX_PATH, 0);
  _tprintf(_T("%s\n"), buf);
 
  return 0;
}
Wie gesagt, ich weiß einfach nicht, wie SysErrorMessage aufgebaut ist, kann natürlich auch das gleiche machen, nur wundert mich die Fehlermeldung etwas. An sich solltest du vielleicht auch das GetLastError direkt rausziehen, damit hier der letzte Fehler nicht durch den Aufruf von z.B. FormatMessage überschrieben wird (gut, passiert wohl eher nicht, aber trotzdem).

Ja, direkt einen Fehler seh ich natürlich auch nicht.
Funktioniert denn das Beispielprogramm an sich? Das hier sieht ja nach einer eigenen Funktion aus.

Gruß Der Unwissende

Luckie 25. Sep 2006 13:21

Re: JNI gesucht
 
So, es hat etwas gedauert, da ich erst mal feststellen musste das MinGW keinen Debugger mitbringt. :wall:

Also dein Testprogramm liefert auch keinen gültigen Pfad zurück. Und es kommt der gleiche fehler wie bei mir:
Zitat:

Das System kann die angegebene Datei nicht finden.
Ich verstehe das nicht. Funktioniert es denn bei dir?

SysErrorMessage ist nur ein Wrapper im MSDN-Library durchsuchenFormatMessage, um es etwas einfacher zu Hand haben.

Der_Unwissende 25. Sep 2006 15:20

Re: JNI gesucht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Luckie
Ich verstehe das nicht. Funktioniert es denn bei dir?

Aber klar doch, würde doch keinen falschen Code posten ;-)
Also ich weiß nicht genau woher der Fehler kommen sollte. Da ich gerade kein MinGW zur Hand habe, hier mal das Kompilat (und ein leicht geänderter QC). Jetzt sollte der Fehlercode mit einer Meldung ausgegeben werden. Bei mir funktioniert alles wie es soll, gültiger Pfad und als Rückgabewert 0 (auf zwei Rechnern, beide mit XP SP 2).

Luckie 25. Sep 2006 17:53

Re: JNI gesucht
 
Werde ich norgen mal an der Arbeit ausprobiern. Danke für deine Mühe.

Luckie 26. Sep 2006 08:45

Re: JNI gesucht
 
Also bei deiner Exe funktioniert es.

Kompiliere ich deinen Quellcode kommt das:
Zitat:

Unable to open key Software\Javasoft\Java Runtime Environment
Error Code 2008950864Fehler beim Laden von á#$
Dann stürzt er ab und will einen Fehlerbericht senden.

Das verstehe ich einfach nicht. Mit Delphi geht es ja. Und warum geht dein Programm bei dir und mir und wenn ich deinen Code kompiliere geht es nicht mehr?

Wie kannst du den Quellcode überhaupt kompilieren? Denn in der Funktion int getJvmDllPath(char* path) ist die Variable res nicht deklariert. Ich kann ihn erst kompilieren, wenn ich die Variable deklariere. Aber selbst dann kompiliert er nur mit Warnungen. Betrifft aber hauptsächlich die Ausgaben mit printf.

Der_Unwissende 26. Sep 2006 09:06

Re: JNI gesucht
 
HI,

Zitat:

Zitat von Luckie
Also bei deiner Exe funktioniert es.

Puh, dachte schon ich hab irgendwie etwas geschaffen, was nur bei mir läuft

Zitat:

Zitat von Luckie
Das verstehe ich einfach nicht. Mit Delphi geht es ja. Und warum geht dein Programm bei dir und mir und wenn ich deinen Code kompiliere geht es nicht mehr?

Das versteh ich auch nicht. Hm, ist merkwürdig. Da würde ich aber fast behaupten, dass es diesmal am Compiler liegen müsste. Der QC kann es ja nicht sein, der ist diesmal gleich. Hast du es mal mit dem BCC5.5 versucht? Den findest du als freien Download auf den Borland-Seiten. Da musst du dann allerdings immer den Biblioteks und Suchpfad angeben oder (in guter Borlandmanier) für den compiler bzw. Linker eine .cfg Datei anlegen, in der die Optionen drin sind.
Jedenfalls hab ich mit dem diesen Code erzeugt. Ja, printf ist natürlich nicht das schönste, aber was gibt es denn so für Alternativen in C? Kenne mich da echt wenig aus :(

Zitat:

Zitat von Luckie
Wie kannst du den Quellcode überhaupt kompilieren? Denn in der Funktion int getJvmDllPath(char* path) ist die Variable res nicht deklariert

Also bei mir (letzte Version die ich eigentlich angehangen habe) steht die Funktion ungefähr so drin:
Code:
int getJvmDllPath(char* path) {
....
  // öffnen des Schlüssels
  // HKEY_LocalMachine\\Software\\JavaSoft\\Java Runtime Enviroment\\
  long res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_PATH_TO_JRE, 0, KEY_READ,
                          &key);
wobei res also gleich in dieser Zeile deklariert wird als long. Deswegen sollte es auch eigentlich keine Probleme beim Compilieren geben. Aber wenn sich sogar der Quellcode beim Übertragen ändert ;-)

Ich weiß ehrlich gesagt nicht, warum es mit MinGW nicht laufen sollte. Wenn es Probleme beim Compilieren gäbe oder so, dann könnte ich das ja noch verstehen, aber wenn er die Datei linkt, dann sollte es eigentlich so laufen. Hast du denn wirklich mal andere Schlüssel zu öffnen versucht? Also wirklich nur eine C Programm, dass nicht mehr macht als einen beliebigen Schlüssel in der Registry zu öffnen?

Gruß Der Unwissende

Luckie 26. Sep 2006 09:20

Re: JNI gesucht
 
Das mit der Deklaration habe ich jetzt auch gesehen. Nur ein Programm, was den betreffenden Schlüssel öffnet, werde ich gleich mal machen.

Luckie 26. Sep 2006 11:34

Re: JNI gesucht
 
So neue Erkenntisse:
Dieser Code:
Code:
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include "MpuTools.h"

int OpenRegPath(TCHAR* Path) {
   HKEY key = NULL;
   
   _tprintf(Path);
   _tprintf(_T("\n"));
   long res = RegOpenKeyExW(HKEY_CURRENT_USER, Path, 0, KEY_READ, &key);   
   
   return res;
}

int main () {
   DWORD res = OpenRegPath(_T("Software\\Intel"));
   if (res != ERROR_SUCCESS) {
      TCHAR szBuf[80];
      _tprintf(_T("%s\n"), SysErrorMessage(GetLastError(), szBuf, countof(szBuf)));   
   }
   else {
      _tprintf(_T("Schlüssel konnte erfolgreich geöffnet werden."));
   }
   return 0;
}
Mit VC kompiliert funktioniert. Der selbe Cod emit MinGW kompiliert funktioniert nicht und der Schlüssel kann nicht geöffnet werden. Ich schließe daraus, dass es sich um eine Einstellungssache bei MinGW handelt. Nur welche?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr.
Seite 4 von 5   « Erste     234 5      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz