matthiasr Geschrieben 6. November 2002 Geschrieben 6. November 2002 Ich möchte mich mit VB befassen und bin gerade dabei meine erste Anwendung zu erstellen. Ich programmiere bereits etwas in C/C++ und möchte behaupten das ich mich grundsätzlich auch in VB orientieren kann. Nun denn meine Anwendung soll einige Werte aus der Regiestry auslesen und hierzu möchet ich die API-Funktion QueryValueEx verwenden. Hierfür habe ich in der MSDN auch ein sehr schönens Beispiel gefunden welches ich für meine Zwecke veränder habe. Ich weis auch schon das ich die Funktion extra deklarieren muss mit alias usw. aber ich bekomme immer wieder Fehlermeldungen wie "Konstanfen, Zeichenfolgen fester Länge, benutzerdefinierte Array und Declare-Anweisungen sind als öffentliche Mittglieder von Objektmodellen nicht zugelasen." Was mache ich falsch???? Schaut Euch doch mal meinen Code an denn der sollte eigentlich dem aus dem Beispiel sinngemäß entsprechen. (Beispiel in der msdn "HOWTO: Use the Registry API to Save and Retrieve Setting" Option Explicit Public Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" _ (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue _ As Long) As Long Private Sub Form_Activate() Const HKEY_CURRENT_USER = &H80000001 Const KEY_ALL_ACCESS = &H3F Dim sKeyName As String Dim lRetVal As Long 'result of the API functions Dim hKey As Long 'handle of opened key Dim vValue As Variant 'setting of queried value lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, KEY_ALL_ACCESS, hKey) lRetVal = QueryValueEx(hKey, sValueName, vValue) RegCloseKey (hKey) txtPrice = vValue End Sub Zitieren
Gast King555 Geschrieben 6. November 2002 Geschrieben 6. November 2002 Der Ausdruck "Public Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" _ (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue _ As Long) As Long" muss unbedingt in ein Modul und darf nicht in ein Formular gepackt werden (wie du es jetzt hast). Dann sollte es klappen. Zitieren
Gast King555 Geschrieben 6. November 2002 Geschrieben 6. November 2002 Wenn du auf Datei - Neu klickst, kannst du allerhand verschiedene neue Dinge anlegen, z.B. Formulare, Module und Klassenmodule. Ein Modul ist wie der Codebereich eines Formulars, nur eben ohne Formular. Sowas fügst du in dein Projekt ein. Module werden automatisch geladen und auch wieder entladen, darum musst du dich also nicht kümmern. Deine API Deklaration musst du in ein solches Modul packen und dann unbedingt als Public deklarieren (hast du schon gemacht). Dann klappt das ganze! Zitieren
matthiasr Geschrieben 6. November 2002 Autor Geschrieben 6. November 2002 Weis nicht, also ich bin über das Projekt-Fenster zu einem neuen Modul gelangt (Modul1) und in dem Prokjekt Pfad gibt es nun auch einen Pfad Modul. Ich habe dann auch die Declaration für die API's eingefügt (siehe unten) aber ich bekomme nun die Fehlermeldung " Sub oder Function nicht definiert". Wo liegt den nun der Hammer begraben, und ich dachte VB sei leichter als C, da nutze ich einfach die Funktion binde vielleicht noch ne dll ein und fertig. Aber ich werd das schon noch schaffen, aber schau es Dir doch bitte nochmals an. Danke Matthias (Modul1) Option Explicit Public Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" _ (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue _ As Long) As Long Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _ (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long (Fromular) Option Explicit Private Sub Form_Activate() Const HKEY_CURRENT_USER = &H80000001 Const KEY_ALL_ACCESS = &H3F Dim sValueName As String Dim sKeyName As String Dim lRetVal As Long 'result of the API functions Dim hKey As Long 'handle of opened key Dim vValue As Variant 'setting of queried value MsgBox ("2") lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, KEY_ALL_ACCESS, hKey) lRetVal = QueryValueEx(hKey, sValueName, vValue) RegCloseKey (hKey) txtPrice = vValue End Sub Private Sub Form_Load() MsgBox ("1") End Sub Zitieren
Gast King555 Geschrieben 6. November 2002 Geschrieben 6. November 2002 Also erstmal würde ich Const HKEY_CURRENT_USER = &H80000001 und Const KEY_ALL_ACCESS = &H3F als Public deklarieren und auch ins Modul packen, also: (Modul1) Public Const HKEY_CURRENT_USER = &H80000001 Public Const KEY_ALL_ACCESS = &H3F Dann: In deinem Form_Activate Ereignis gibst du ja garnicht an, welchen Registry Wert du auslesen möchtest. Du schreibst: lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, KEY_ALL_ACCESS, hKey) lRetVal = QueryValueEx(hKey, sValueName, vValue) Da stehen ja nur Variablen drin, die leer sind. Was soll VB denn nun aus der Registry auslesen? Und nochwas: Wenn ein Fehler auftritt, klick einfach mal auf "Debuggen". Dann siehst du auch, in welcher Zeile der Fehler ist. Zitieren
matthiasr Geschrieben 6. November 2002 Autor Geschrieben 6. November 2002 Ja die Funktionen sind noch nicht vollständig, aber die Function ist scheinbar immer noch nicht definiert. Was fehlt mir dan noch???? Option Explicit Private Sub Form_Load() Dim sValueName As String Dim sKeyName As String Dim lRetVal As Long 'result of the API functions Dim hKey As Long 'handle of opened key Dim vValue As Variant 'setting of queried value sKeyName = "Verdienst" lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Indatec\\Questico", _ 0, KEY_ALL_ACCESS, hKey) lRetVal = QueryValueEx(hKey, sValueName, vValue) RegCloseKey (hKey) txtPrice = vValue End Sub Zitieren
matthiasr Geschrieben 6. November 2002 Autor Geschrieben 6. November 2002 Da kommt mir doch noch eine Frage. Wenn ich in C diese Funktion verwende da ist das Schlüsselwort HKEY_CURRENT_USER bekannt, ich brauch es nicht erst declarieren. Ist das normal in VB. Desweitern ist mir aufgefallen das ich bei RegOpenKeyEx den Rückgabewert abfangen muss, wenn ich das weglassen bekomme ich eine Fehlermeldung. Hat mich sehr überrascht. Vieleicht kannst Du mir das auch etwas näher erklären. Matthias Zitieren
Gast King555 Geschrieben 6. November 2002 Geschrieben 6. November 2002 Du deklarierst die API als "RegOpenKey" und benutzt dann aber "RegOpenKeyEx", klar das dann ein Fehler kommt. Ändere das mal, nenne am besten die Deklaration "RegOpenKeyEx". Das mit dem Rückgabewert ist seltsam, eigentlich sollte es auch ohne gehen. Ich hoffe du bedenkst, dass du ohne Rückgabewert keine Klammern machen darfst, Beispiel: x = Function(Param) oder Function Param Und API Konstanten sind VB generell unbekannt! Du musst leider alles erst deklarieren! Zitieren
matthiasr Geschrieben 6. November 2002 Autor Geschrieben 6. November 2002 Also bei Dir fühlt man sich als Anfänger wirklich aufgehoben, stimmt da habe ich nicht genau genug hingeguckt beim kopieren. Das man die Klammern weglassen kann, oder muss wusste ich nicht. Nun ruft aber die Heimat und ich kann es erst morgen testen würde mich aber freuen wenn ich mich wieder an Dich wenden kann. Vielen Dank Matthias Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.