AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Thema durchsuchen
Ansicht
Themen-Optionen

Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

Ein Thema von Luckie · begonnen am 2. Mai 2005 · letzter Beitrag vom 3. Jun 2005
Antwort Antwort
Seite 5 von 14   « Erste     345 67     Letzte »    
Blutiger Anfänger
(Gast)

n/a Beiträge
 
#41

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 00:32
hallo Mephistopheles,

falls du die shlwapi.dll meinst, siehe Seite 2 , Beitrag 7
Fakt ist, dass das was du beschrieben hast schon erwaehnt wurde , wenn auch mit einem Button auf einem Form.
Daraus geht hervor, dass die o.g. DLL ueber die gewuenschten Funktion (Ordinal 185)verfuegt!
IHMO nach, stellt sich doch die Frage , wie erfolgt die Auswertung,welche SystemDatei oder DLL etc...
wertet die ganze Geschichte aus?
Wo liegt der Unterschied zwischen XP SP1 , W2K, XP SP2 ,und auch (WIN 98),denn hingegen der Aussage von Microsoft,funktioniert das Programm auch dort !
An der shlwapi.dll jedenfalls nicht !!
Siehe Seite 2 , Beitrag 7 !

Gruss OPA
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#42

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 00:36
Zitat von Blutiger Anfänger:
Siehe Seite 2 , Beitrag 7 !
Das ist der Beitrag von NicoDE. Ich sehe nicht, was der aussagen soll. Ist auch egal.
Es ging mir auch nicht darum nachzuweisen, daß die Funktion existiert, sondern vielmehr, daß sie aufgerufen wird. Ich teste mal eben noch was.
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#43

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 00:46
Sowohl auf W2K als auch auf WXP liefert GetLastError() den Fehler 1411 ("Class does not exist.").

Dieser "Fehler" scheint mir aber nichts mit dem eigentlichen Problem zu tun zu haben (ich vermute, daß dieser Fehler durch die Fehlende GUID in der Registry verursacht wird). Werde das mal testen.

Nein, meine Vermutung ist falsch. Mit der GUID hat es nichts zu tun (die wird ja eingetragen, wenn man die Checkbox anwählt). Dann könnte mit Klasse noch ein COM-Objekt oder eine Fensterklasse gemeint sein. Bei einer Fensterklasse wäre es von daher plausibel, weil sogar bei Dialogen die Erstellung (unter bestimmten Umständen) fehlschlägt, wenn eine Klasse eines Child-Controls nicht registriert ist.

Okay, Doku habe ich gefunden.
  Mit Zitat antworten Zitat
Blutiger Anfänger
(Gast)

n/a Beiträge
 
#44

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 00:54
ich noch mal,

Seite 2, Beitrag Nr. 7, nicht Seite 1, Beitrag Nr.5 !
Das war nicht boes gemein, ich wollte Dir nur Arbeit und Zeit ersparen !

Gruss OPA
  Mit Zitat antworten Zitat
Blutiger Anfänger
(Gast)

n/a Beiträge
 
#45

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 00:59
Da war ich auch schon,

die hat doch IHMO mit unserem Problem nichts zu tun !?
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#46

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 01:40
Gib mal bitte den Link zu dem Beitrag den du meinst. Ich habe 25 Beiträge pro Seite aktiviert, du vermutlich nicht?!

So, ansonsten war ich nochmal mit dem Debugger zugange. Wenn ich statt 185 die 191 (die Unicode-Variante) aufrufe, bekomme ich stattdessen den Fehler 1400. Der Check nach dem Wert in besagtem Registrykey verläuft okay. Es wird also erkannt, daß er nicht existierte. Problem ist nun, daß die Funktionen nur als Ordinal exportiert werden, denn so fehlen wichtige Informationen über jene APIs, die von unserer Funktion aufgerufen werden. Der Einfachheit halber habe ich meinen Code auf statische Einbinden der Funktion getrimmt:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}
uses
  CommCtrl,
  Windows;

function SHMessageBoxCheckW(hWnd: THandle; Text: PWideChar; Title: PWideChar;
    dwType: DWORD; Default: Integer; RegVal: PChar): Integer; stdcall; external 'shlwapi.dllindex 191;

function GetShellWindow():HWND; stdcall; external 'user32.dll';

begin
  InitCommonControls();
  SetLastError(ERROR_SUCCESS);
  SHMessageBoxCheckW(GetShellWindow(), 'Dies ist nur ein Testtext.',
    'Und dies ist der Titel', MB_OK or MB_ICONINFORMATION, IDNO,
    '2A622957-D0A5-41CA-8571-898247531A2C');
  Writeln(GetLastError());
  Readln;
end.
Ich versuche mir noch die PDB zu besorgen, damit ich vielleicht doch noch weiterhelfen kann.
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#47

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 03:22
Habe mal die IDC angehangen, falls jemand meine Analyse in IDA fortführen will. Die IDC wurde exportiert von IDA 4.7, ich weiß also nicht, ob auch frühere Versionen funktionieren!

Alternativ ist noch eine HTML (in der 7z) angehangen, die ca 22 MB groß ist und das komplette Disassemblat wunderbar eingefärbt enthält.

Nachtrag: Ach ja interessant im Disassemblat ist natürlich nur Ordinal 191 und alle von dortaus aufgerufenen Funktionen!
Angehängte Dateien
Dateityp: zip shlwapi_idc_119.zip (4,5 KB, 3x aufgerufen)
Dateityp: 7z shlwapi_126.7z (854,3 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#48

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 11:35
Zitat von Mephistopheles:
Wenn ich statt 185 die 191 (die Unicode-Variante) aufrufe, bekomme ich stattdessen den Fehler 1400.
Den Fehler habe ich in beiden Varianten (Ansi und Unicode) erhalten. Laut der Funktion von Luckie (SystemErrorMsg) bedeutet er in Klartext übersetzt Ungültiges Fensterhandle. Er verschwindet erst, wenn du den Dialog nicht mehr anzeigen lässt.
Egal, ich habe beides (Ansi und Unicode) auf einem XP SP2- und auf einem 2000 SP4-Rechner ausprobiert. Ging in beiden Fällen tadellos. Warum sich also XP SP1 beim blutigen Anfänger verschluckt, kann ich nicht erklären. Und warum im PSDK XP SP2 die Funktion genannt wird, nicht aber die Tatsache, dass sie sich offenbar nur mit den numerischen Indexwerten laden lässt, weiß ich ebenso wenig.

Generell finde ich den Dialog etwas nutzlos. Solange man sich den Dialog anzeigen lässt, solange hat man die freie Auswahl. Sobald man ihn jedoch per Option beim nächsten Mal nicht mehr sehen will, benutzt er den Defaultwert. Im PSDK steht ja auch, dass man das nicht mit dem "Diese Antwort merken und beim nächsten Mal nicht mehr fragen"-Dialog durcheinander bringen soll. Wollen wir nicht den suchen? Der muss doch auch irgendwo stecken. Na ja, notfalls hätte ich ein paar kleine API-Registryfunktionen, die das für "SHMessageBoxCheck" nachrüsten
Delphi-Quellcode:
function SHDeleteEmptyKeyA(regKey: HKEY; pszSubKey: PAnsiChar): dword;
  stdcall; external 'shlwapi.dll';

const
  RememberThisAnswerPath =
    'Software\Microsoft\Windows\CurrentVersion\Explorer\RememberThisAnswer';
  HideDialogPath =
    'Software\Microsoft\Windows\CurrentVersion\Explorer\DontShowMeThisDialogAgain';

function RememberThisAnswer(const DialogGuid: PAnsiChar;
  const DialogResult: dword): boolean;
var
  reg : HKEY;
begin
  Result := false;

  if(RegCreateKeyEx(HKEY_CURRENT_USER, RememberThisAnswerPath, 0, nil,
    REG_OPTION_NON_VOLATILE, KEY_READ or KEY_WRITE, nil, reg, nil) =
    ERROR_SUCCESS) then
  try
    Result := RegSetValueEx(reg, DialogGuid, 0, REG_DWORD, @DialogResult,
      sizeof(DialogResult)) = ERROR_SUCCESS;
  finally
    RegCloseKey(reg);
  end;
end;

function GetRememberedAnswer(const DialogGuid: PAnsiChar;
  const DefaultValue: dword): dword;
var
  reg : HKEY;
  dwType,
  dwLen : dword;
begin
  Result := DefaultValue;

  if(RegOpenKeyEx(HKEY_CURRENT_USER, RememberThisAnswerPath, 0,
    KEY_READ, reg) = ERROR_SUCCESS) then
  try
    dwType := REG_NONE;
    dwLen := 0;

    if(RegQueryValueEx(reg, DialogGuid, nil, @dwType, nil, @dwLen) = ERROR_SUCCESS) and
      (dwType = REG_DWORD) and
      (dwLen = sizeof(dword)) then
    begin
      if(RegQueryValueEx(reg, DialogGuid, nil, @dwType,
        @Result, @dwLen) <> ERROR_SUCCESS) then
      Result := DefaultValue;
    end;
  finally
    RegCloseKey(reg);
  end;
end;

procedure DeleteValAndEmptyKey(const RegKey, DialogGuid: PAnsiChar);
var
  reg : HKEY;
begin
  if(RegOpenKeyEx(HKEY_CURRENT_USER, RegKey, 0,
    KEY_READ or KEY_WRITE, reg) = ERROR_SUCCESS) then
  try
    RegDeleteValue(reg, DialogGuid);
  finally
    RegCloseKey(reg);
  end;

  SHDeleteEmptyKeyA(HKEY_CURRENT_USER, RegKey);
end;

procedure DeleteRememberedAnswer(const DialogGuid: PAnsiChar);
begin
  DeleteValAndEmptyKey(RememberThisAnswerPath, DialogGuid);
end;

procedure EnableHiddenDialog(const DialogGuid: PAnsiChar);
begin
  DeleteValAndEmptyKey(HideDialogPath, DialogGuid);
end;


procedure TForm1.Button1Click(Sender: TObject);
const
  RegVal = '2A622957-D0A5-41CA-8571-898247531A2C';
var
  defaultVal,
  dialogResult : dword;
begin
  defaultVal := GetRememberedAnswer(RegVal, ID_YES);
  dialogResult := SHMessageBoxCheckA(self.Handle,'Dies ist nur ein Testtext.',
    'Und dies ist der Titel',MB_YESNO or MB_ICONINFORMATION,defaultVal,RegVal);
  RememberThisAnswer(RegVal, dialogResult);
end;
  Mit Zitat antworten Zitat
Blutiger Anfänger
(Gast)

n/a Beiträge
 
#49

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 12:15
Hallo Mathias,

ich wollte hier keine Beschaeftigungstherapie betreiben, es geht auch nicht darum, dass das Programm
bei mir unter XP SP1 laufen soll, es laeuft ja z.B. unter W2k !
Hatte nur angenommen, dass es fuer einige andere Anwender auch von Interesse ist , warum dies so ist.
Evtl. koennte dies ja auch fuer andere Funktionen von Belang sein !
Mich interessiert warum wieso weshalb...!
Nur liegt es mir fern das halbe Forum damit zu beschaeftigen!
Es sollten sich nur die Leute angesprochen fuehlen, die selbst die Ursache finden wollen!
Also bitte meinetwegen keinen weiteren Aufwand betreiben !

Gruss OPA!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#50

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 12:29
Zitat von MathiasSimmack:
Im PSDK steht ja auch, dass man das nicht mit dem "Diese Antwort merken und beim nächsten Mal nicht mehr fragen"-Dialog durcheinander bringen soll. Wollen wir nicht den suchen?
Der würde mich auch interessieren.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 14   « Erste     345 67     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz