Hallo Thomas,
Dein Code-Beispiel produziert bei mir unter Windows XP SP3
einen "Ungültigen Speicherzugriff (Lesefehler an Adresse 0)"
beim Aufruf von SHMessageBoxCheck()...
Unter Windows 7 SP1 x32 funktioniert Dein Beispiel. Der Grund
liegt darin, daß Du nicht überprüfst, ob GetFunction() einen Wert
von 0 zurückgegeben hat. In der Shlwapi.dll von Windows XP
werden anscheinend die Funktionsnamen SHMessageBoxCheckA
und SHMessageBoxCheckW nicht exportiert, sondern nur der
Index ihrer Funktionseinträge:
http://www.codeguru.com/forum/archive/i ... 55698.html
In Paules PC-Forum hattes Du auch schon einmal einen
Thread mit
einem Code-Beispiel gestartet. Auf den dort geäußerten Hinweis
eines Anwenders, daß die Funktion in der Shlwapi.dll seines
Windows XP SP2 nicht gefunden wird, hattest Du lediglich
geantwortet:
ts-soft hat geschrieben:Shlwapi.dll (version 5.0 or later)
Ab Windows 2000 immer vorhanden! Lediglich der Registry-Eintrag könnte
unter älteren Systemen leicht woanders sein.
Das Problem ist aber nicht, daß die Shlwapi.dll nicht vorhanden ist,
sondern daß der Funktionsname anscheinend in einigen Versionen
der DLL nicht exportiert wird...
Ich habe daher Dein Beispiel entsprechend angepaßt:
Code: Alles auswählen
EnableExplicit
Prototype SHMessageBoxCheck(hWnd, Text.s, Caption.s, uType, iDefault, RegVal.s)
Procedure MessageRequesterCheck(Titel.s, Text.s, RegVal.s, Flags = 0)
Protected hDLL = OpenLibrary(#PB_Any, "Shlwapi.dll")
Protected SHMessageBoxCheck.SHMessageBoxCheck
Protected result
CompilerIf #PB_Compiler_Unicode
SHMessageBoxCheck = GetFunction(hDLL, "SHMessageBoxCheckW")
If SHMessageBoxCheck = 0
If OSVersion() = #PB_OS_Windows_XP
SHMessageBoxCheck = GetFunctionEntry(hDLL, 191)
EndIf
EndIf
CompilerElse
SHMessageBoxCheck = GetFunction(hDLL, "SHMessageBoxCheckA")
If SHMessageBoxCheck = 0
If OSVersion() = #PB_OS_Windows_XP
SHMessageBoxCheck = GetFunctionEntry(hDLL, 185)
EndIf
EndIf
CompilerEndIf
If SHMessageBoxCheck
result = SHMessageBoxCheck(0, Text, Titel, Flags, #PB_Ignore, RegVal)
EndIf
CloseLibrary(hDLL)
ProcedureReturn result
EndProcedure
OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "bla")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Select MessageRequesterCheck("Nervende Frage:", "Willst Du das Fenster wirklich schliessen oder " + #LF$ + "haste aus Langeweile das Schliessenkreuz gedrückt?", "Pure_Beginner_EinmaligerString", #PB_MessageRequester_YesNo)
Case #PB_MessageRequester_Yes, #PB_Ignore
Break
EndSelect
EndSelect
ForEver