Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Anfänger Probleme

Empfohlene Antworten

Veröffentlicht

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

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.

Sorry Modul?

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!

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

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.

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

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

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!

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.