![]() |
Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Laut des
![]()
Delphi-Quellcode:
sind mit der Fehlermeldung:
type
TSHMessageBoxCheck = function(hWnd: THandle; Text: PChar; Title: PChar; Tpye: DWORD; Default: Integer; RegVal: PChar): Integer; procedure TForm1.Button1Click(Sender: TObject); var hLib: THandle; SHMessageboxCheck: TSHMessageBoxCheck; begin hLib := LoadLibrary('shlwapi.dll'); if hLib <> INVALID_HANDLE_VALUE then begin @SHMessageboxCheck := GetProcAddress(hLib, 'SHMessageBoxCheckA'); if Assigned(SHMessageboxCheck) then begin SHMessageboxCheck(Handle, 'Test', 'Titel', MB_OK, 0, '1CD2DD9C-92CB-4931-B03D-E4164D134501'); end else RaiseLastOSError; end; end; Zitat:
Dabei dachte ich, sie könnte sie ganz nützlich sein. |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Zitat:
Hier noch ein C Fragement:
Code:
+ * @ [SHLWAPI.185]
+ * + * Pop up a 'Don't show this message again' dialogue box. + * + * PARAMS + * hWnd [I] Window to be the dialogues' parent + * lpszText [I] Text of the message to show + * lpszTitle [I] Title of the dialogue box + * dwType [I] Type of dialogue buttons (See below) + * iRet [I] Value to return if dialogue is not shown + * lpszId [I] Name of registry subkey which determines whether to show the dialog + * + * RETURNS + * Success: The value returned from the dialogue procedure (e.g. IDOK). + * Failure: iRet, if the default dialogue resource could not be loaded or the + * dialogue should not be shown. + * + * NOTES + * - Both lpszTitle and lpszId must be less than MAX_PATH in length. + * - Possible values for dwType are: + *| Value Buttons + *| ----- ------- + *| 0 OK + *| 1 OK/Cancel + *| 2 Yes/No + */ +INT_PTR WINAPI SHMessageBoxCheckA(HWND hWnd, LPCSTR lpszText, LPCSTR lpszTitle, + DWORD dwType, INT_PTR iRet, LPCSTR lpszId) +{ + WCHAR szTitleBuff[MAX_PATH], szIdBuff[MAX_PATH]; + WCHAR *szTextBuff = NULL; + int iLen; + INT_PTR iRetVal; + + if (lpszTitle) + MultiByteToWideChar(CP_ACP, 0, lpszTitle, -1, szTitleBuff, MAX_PATH); + + if (lpszText) + { + iLen = MultiByteToWideChar(CP_ACP, 0, lpszText, -1, NULL, 0); + szTextBuff = HeapAlloc(GetProcessHeap(), 0, iLen * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpszText, -1, szTextBuff, iLen); + } + + MultiByteToWideChar(CP_ACP, 0, lpszId, -1, szIdBuff, MAX_PATH); + + iRetVal = SHMessageBoxCheckW(hWnd, szTextBuff, lpszTitle ? szTitleBuff : NULL, + dwType, iRet, szIdBuff); + if (szTextBuff) + HeapFree(GetProcessHeap(), 0, szTextBuff); + return iRetVal; +} + |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Zitat:
Würde mich mal interessieren. Die Formatierung der Funktionsnamen klingt nach LIB-Einlesen. |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
ah, danke. allerdings bekomm eich jetzt eine AccessViolation:
Delphi-Quellcode:
:gruebel:
type
TSHMessageBoxCheck = function(hWnd: THandle; Text: PWideChar; Title: PWideChar; Tpye: DWORD; Default: Integer; RegVal: PWideChar): Integer; procedure TForm1.Button1Click(Sender: TObject); var hLib: THandle; SHMessageboxCheck: TSHMessageBoxCheck; begin hLib := LoadLibrary('shlwapi.dll'); if hLib <> INVALID_HANDLE_VALUE then begin @SHMessageboxCheck := GetProcAddress(hLib, PChar(185)); if Assigned(SHMessageboxCheck) then begin SHMessageboxCheck(Handle, 'Test', 'Titel', MB_OK, 0, '1CD2DD9C-92CB-4931-B03D-E4164D134501'); end else RaiseLastOSError; end else RaiseLastOSError; end; |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Zitat:
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Zitat:
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
So geht's:
Delphi-Quellcode:
Hat noch irgendjemand Verbesserungsvorschläge?
function MessageBoxCheck(hWnd: THandle; Text: PChar; Title: PChar;
dwType: DWORD; Default: Integer; RegVal: PChar): Integer; type TSHMessageBoxCheck = function(hWnd: THandle; Text: PChar; Title: PChar; dwType: DWORD; Default: Integer; RegVal: PChar): Integer; stdcall; var hLib: THandle; SHMessageboxCheck: TSHMessageBoxCheck; begin hLib := LoadLibrary('shlwapi.dll'); if hLib <> 0 then begin @SHMessageboxCheck := GetProcAddress(hLib, PChar(185)); if Assigned(SHMessageboxCheck) then begin result := SHMessageboxCheck(hWnd, Text, Title, dwType, 0, RegVal); end else result := GetLastError; end else result := GetLastError; FreeLibrary(hLib); end; procedure TForm1.Button1Click(Sender: TObject); begin MessageBoxCheck(Handle, 'Dies ist nur ein Testtext.', 'Und dies ist der Titel', MB_OK or MB_ICONINFORMATION, 0, '2A622957-D0A5-41CA-8571-898247531A2C'); end; Code verbessert. |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Hallo zusammen,
leider habe ich gleich zwei Probleme. :( 1.Mit dem o.a. Quelltext hat der Button nur ein muedes zucken fuer mich uebrig. 2.Dumpbin liefert mir keine Ergebnisse. Zu 1.) Muss zu diesem Quellcode noch irgendetwas hinzugefügt werden, ausser den Vorgaben, die durch die Unit schon automatisch erfolgen ??? Zu 2.) Mit dem Aufruf von Dumpbin bekomme ich von keiner Dll den Inhalt angezeigt, egal ob ich mit der Option out: filname, oder das Ergebnis mit ">" in eine Datei umleite ! :?: Betriebssystem: WinXP mit ServicePack 1; Shlwapi.Dll, Version 6.0.2800.1106; Dumpbin.exe vom 29.03.2002 (2 KB)! Kann mir jemand sagen (schreiben), was ich falsch mache, leider weiss ich auch, dass 99 % der Fehler vor der Tastatur sitzen !! Trotzdem waere es nett, wenn ich einen Tipp bekommen koennte Danke,OPA :drunken: |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Sorry,
ich wollte hier keine Themen anschneiden die hier nicht hingehoeren! Mit Dumpbin wollte ich lt. dem Beispiel von TOMS kontrollieren, ob in meiner vorhandenen DLL die von dir genannten Funktionen hinterlegt sind! Was ich meine !! Wenn das OnClick Ereignis auf Button1 ausgefuehrt wird, erscheint bei mir keine Meldung, keine Box ! Ich ging davon aus, dass das der Sinn des Programm's war . Ansonsten SORRY :duck: und Danke |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Dann geh das doch mal in Einzelschritten durch und guck, wo der Fehler liegt, deswegen ist ja die Fehlerbehandlucng mit den if's drinne.
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Hi,
genau das ist ja das Problem, sonst haette ich das auslesen der DLL nicht versucht, wenn ich das Programm im EinzelschrittModus laufen lasse, werden alle noetigen Funktionen erfüllt. Leider erfolgt keine Bildschirmausgabe mit irgendeiner Meldung! Fehlermeldungen gibt es auch nicht! :gruebel: |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Zitat:
Unblutige Grüße vom marabu |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
hallo Marabu,
vielen Dank fuer die unblutigen Gruesse, aber es hat bisher noch nie eine Bildschirmausgabe stattgefunden, es ei denn, sie erscheint nicht im Vordergrund und nur fuer einen kurzen Moment, aber das glaube ich nicht. Vielleicht bin ich einfach nur zu blöde, obwohl ich ja nur den Code von Michael kopiert und in ein neu erstelltes Formular mit einem Button eingefügt habe. Nur wenn es bei allen anderen funktioniert, wird es wohl an mir liegen !! Danke trotzdem Gruss Opa |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Hallo Opa,
schau mal in der Registry nach, ob der Dialog da eingetragen ist:
Code:
marabu
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\DontShowMeThisDialogAgain
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Hi Marabu,
nein, der Eintrag ist nicht vorhanden ! |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Zitat:
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Zitat:
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
hab auch in einem anderen Post von dir (luckie) gelesen das du auch mal eine dll so geladen hast:
Delphi-Quellcode:
das würde ich auf keinem fall so machen aus dem einfachen grund wenn eine andere dll FreeLibrary('bla.dll') ausführt
h := GetModuleHandle('bla.dll')
if h = 0 {bzw bei dir INVALIDHANDLEVALUE was aber falsch ist} then h := LoadLibrary('bla.dll'); die dll freigegeben wird und bei jedem aufruf eines exports später es einen crash gibt lädt man die dll aber ein 2. mal mit LoadLibrary('bla.dll') dann kann die andere dll ruhig FreeLibrary('bla.dll') machen solange der "loadcount" nicht 0 ist wird die dll nicht freigegeben und du kannst sie ohne probleme weiterbenutzen ausserdem ist es kürzer :) |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Ist ja mittlerweile korrigiert. Aber es ist nochnicht geklärt, warum es bei dem einem Benutzer noch nicht geht.
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Hallo zusammen,
ich will ja nicht nerven, aber im Einzelschritt-Modus wird alles einwandfrei ausgefuehrt, aber die Bildschirmausgabe fehlt, beim Betaetigen des Buttons bewegt sich kurz der Cursor, dass System reagiert also auf die Eingabe, aber nicht mit einer sichtbaren Ausgabe. Danke,OPA |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
noch einmal hallo zusammen,
das Problem ist teilweise gelöst, d.h. mit der selben DLL laeuft das Programm unter WIN2k einwandfrei. Auf einem anderen identischen Rechner unter XP nicht. Insgesamt sieht es so aus: Zwei verschiedene Rechner, Installation XP, die selbe DLL, keine Funktion ! Dritter Rechner , die selbe DLL, unter WIN2k , Funktion einwandfrei! Warum , wieso, weshalb, kann ich noch nicht sagen. Aber ich werde es Euch mitteilen, sobald ich den Fehler geunden habe!! Danke noch einmal fuer Eure Mühe !!! Opa |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Hat der XP-Rechner schon SP2? Dann könnte es sein, daß die DLL irgendwelche Schweinereien im Speicher macht, die man lieber ab SP2 nicht mehr machen sollte. Dann dürfte es auch nicht auf W2K3 SP1 laufen!
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
hallo Mephistopheles,
auf beiden XP Rechnern ist "nur" ServicePack 1, W2K3 besitze ich nicht, auf W2k einwandfreie Funktion OPA |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Eventuell wird die Funktion mit der XP DLL mit einem anderen Index Exportiert. Könnte da mal jemand nachgucken?
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Sagst du mal, welche DLL du meinst?
XP hat auch ein anderes Handling des Stack und von SEH. Das sind alles potentielle Inkompatibilitäten! |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
hallo nochmal,
die "XP DLL" habe ich auf W2k in einen "TestPfad" kopiert, in Luckie's Programm gebe ich dann diesen Pfad mit an. Es ist die SELBE DLL, nicht die GLEICHE ! Gruss OPA |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Um welche DLL geht es denn?
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
es geht um die shlwapi.dll
OPA |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Sorry, Nachtrag!
Da es sich aber umdie SELBEN DLL's handelt, wird der Fehler wohl mit meinen Installationen zusammenhaengen, oder bin ich der einzige, der das bisher unter XP Prof. mit SP 1 versucht hat ??? OPA |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
XP SP2 geht bei mir. Ich wüsste jetzt aber nicht, warum sich der Index von einem Servicepack zum anderen geändert haben soll. :gruebel: Zumal die Funktion im PSDK XP SP2 auch offen erwähnt wird.
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Zitat:
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
*grml* Das ist so eine schöbe Funktion, wen nman mal so eine Messagebox braucht. Sich so was selber bastelen ist ja doch etwas umständlich. Und dann scheitert das ganze weil MS zu blöd ist das ganz normal zu implementieren wie jede andere Messagebox auch.
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
und noch mal Hallo,
nachdem ich einige Kombinationen mit verschiedenen DLL's ausprobiert habe , u.a. ![]() wird zwar nicht der aktuelle Fehler beschrieben, aber konnte ja sein, dass es funktioniert, war nix !!! Habe dann ein nacktes Sytem neu aufgesetzt, XP SP1, war auch nix ! Soll nur zu Info sein, nicht dass noch jemand das gleiche probiert. Ansonsten wuerde mich interessieren ob jemand das Programm unter XP SP1, an's laufen bekommen hat. In dem Fall waere ein Directory - Listing von Windows\System32 interessant. Bis dann Opa |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Ich setze mich mal kurz dran. Also es kann schonmal nicht daran liegen, daß die Funktion nicht existiert. Ordinal 187 existiert auch in XP SP1!
|
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Hi,
es wird aber Ordinal 185 verwendet !! Gruss OPA |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich habe Luckies Code ein wenig angepaßt, damit er direkt aufgerufen werden kann. Es gibt allerdings kein OleInitialize o.ä. (falls das notwendig wäre!). Auf W2K läuft der Code tadellos. Auf WXP erscheint keine MessageBox.
Delphi-Quellcode:
Ich bin es mit IDAs Debugger durchgegangen und es wird die Funktion 185 aufgerufen. Danach habe ich mit FileMon und RegMon gecheckt, ob es Rechteprobleme o.ä. gibt, was nicht der Fall war. Entsprechend ist meine Diagnose, daß es sich um ein Problem innerhalb von 185 oder einer der aufgerufenen Funktionen handelt. Da ich aber keine Zeit für eine detaillierte Analyse der Funktion im Debugger habe, muß das wohl jemand anderes übernehmen!
program Project1;
{$APPTYPE CONSOLE} uses Windows; function MessageBoxCheck(hWnd: THandle; Text: PChar; Title: PChar; dwType: DWORD; Default: Integer; RegVal: PChar): Integer; type TSHMessageBoxCheck = function(hWnd: THandle; Text: PChar; Title: PChar; dwType: DWORD; Default: Integer; RegVal: PChar): Integer; stdcall; var hLib: THandle; SHMessageboxCheck: TSHMessageBoxCheck; begin hLib := LoadLibrary('shlwapi.dll'); if hLib <> 0 then begin @SHMessageboxCheck := GetProcAddress(hLib, PChar(185)); if Assigned(SHMessageboxCheck) then begin result := SHMessageboxCheck(hWnd, Text, Title, dwType, 0, RegVal); end else result := GetLastError; end else result := GetLastError; FreeLibrary(hLib); end; begin MessageBoxCheck(0, 'Dies ist nur ein Testtext.', 'Und dies ist der Titel', MB_OK or MB_ICONINFORMATION, 0, '2A622957-D0A5-41CA-8571-898247531A2C'); end. PS: Ordinal 187 war ein Verschreiberling ;) ... ich meinte 185 |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
habe aber jetzt , wie vorhin beschrieben, ein System ganz neu aufgesetzt, reines BS mit SP1!!
Wahrscheinlich IMHO haengt das mit der Abhaengigkeit verschiedener DLL's zusammen, nur um das herauszufinden muesste ein System mit o.g. Konfiguration laufen, deswegen waere ja dann ein Listing von Windows\System32 interessant. Natuerlich kann das auch mit der Kernel32.dll etc.. zusammenhaengen, nur bin ich da mit meinem Latein am Ende, dies zu analysieren. So tief gehen meine Betriebssytemkenntnisse LEIDER nicht ! Wenn du eine Loesung finden solltest, um so besser, dann waere allerdings auch der Loesungsweg (fuer mich) interessant :) Gruss OPA |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
hoppla,
da warst du wohl schneller, nur deine Diagnose wurde schon vorher in Erwaegung gezogen, aber wahrscheinlich hast di dir nicht alle Beitraege angeschaut, habe Eingangs beschrieben (ich meine auf Seite 2), dass der Button auf das OnClick-Ereignis reagiert, allerdings ohne Bildschirmausgabe! Schade dass du keine Zeit hast das zu analysieren, meine Faehigkeiten reichen da leider nicht aus. Trotzdem Danke, OPA |
Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Du meinst den TButton auf einem TForm? Ich hatte ja nichtmal ein Form. Fakt ist, daß die Funktion aufgerufen wird, daß sie existiert und daß es möglich sein sollte daß eine MessageBox ausgegeben wird. Leider konnte ich nirgends eine Doku zu dieser Funktion auftreiben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr. |
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