PDA

Vollständige Version anzeigen : VBA-Modul Windows API entfernt im Modul Variablendeklaration


Florian000
10.07.2012, 20:21
Hallo Allerseits,

ich habe ein Problem mit einem Aufruf einer Windows API in Office 2010(x64):
Bei mir wird nach Aufruf einer Windows - API - Funktion (RegOpenKeyEx) die gesmte Variablendeklaration im Modul gelöscht, sprich alle vordeklarierten globalen Variable im Modul, in der die Funktion aufgerufen, können nach dem ausführen der API-Funktion nicht mehr verwendet werden, da immer der Fehler "Objektverweis oder With Blockvariable nicht festgelegt" auftritt. Ich nehme an da wird etwas vom Modul im Speicher gelöscht, nachdem ausführen dieser API-Funktion. Die Funktion selber liefert 0 zurück, also hat die Ausführung funktioniert oder?

Ich deklariere die API-Funktion so:
Public Declare PtrSafe Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long

Verwendet wird sie so:
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const g_sRegKeyA = [RegKey]
Public Const KEY_QUERY_VALUE = &H1
Dim hKey As Long
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, g_sRegKeyA, 0, KEY_QUERY_VALUE, hKey)

Ich weiße leider nicht mehr weiter und wollte nur wissen ob euch dieser Fehler bekannt ist bzw. wie ich diesen vermeiden kann?

Vielen lieben Dank!

Florian

R J
10.07.2012, 21:14
Hi Florian,

Du vergibst der Funktion den Alias RegOpenKeyExA, versuchst aber der (hier nicht erkenntlich deklarierten) Variablen IResult einen Wert über den Aufruf RegOpenKeyEx (ohne A) zuzuweisen. Vielleicht liegt es ja daran?

haklesoft
11.07.2012, 08:14
Hallo Florian,

Auffälligkeiten:

In Deiner Declaration ist PtrSafe enthalten. Das gehört da nicht hin.

Außerdem übergibst Du lpSubkey eine seltsame Konstante g_sRegKeyA = [RegKey]. Das sollte ein (variabler) String sein und den zu öffnenden Registryabschnitt bezeichnen.

Der Aufruf als RegOpenKeyEx ist aber OK.

Hang loose, haklesoft

Florian000
11.07.2012, 09:30
Hallo,

Vielen Dank für die Rückmeldung.

@R J
Der Name nach dem Alias ist der richtige Funktionsname, so wie er in der Dll definiert ist.
Der andere Name davor ist mein Funktionsname, so wie ich die API-Funktion aufrufe => Die beiden Namen können auch dieselbe Bezeichnung haben.
Die Variable lResult ist mit dem Datentyp long deklariert.

@haklesoft:
Das PtrSafe benötige ich da ich mit einem 64bit Office arbeite und die Windows-API-DLLS mit 32-bit kompiliert wurden und ich diese sonst nicht verwenden kann.

Aber ich habe glaub ich die Lösung gefunden: (Für alle die dasselbe Problem haben):
http://msdn.microsoft.com/de-de/library/ee691831.aspx#odc_office2010_Compatibility32bit64bit_ApplicationProgrammingInter faceCompatibility => Siehe API-Kompatibilität

Kurze Erklärung:
Der Long-Datentyp den ich verwende ist ein 32 - bit Datentyp und dieser schneidet die oberen Bits einfach ab => Arbeitsspeicher wird beschädigt bzw. Adressen im Speicher werden einfach überschrieben.

lg,
florian