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 1 von 14  1 2311     Letzte »    
Benutzerbild von Luckie
Luckie

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

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

  Alt 2. Mai 2005, 04:36
Laut des PSDK soll die Funktion SHMessageBoxCheck in der DLL shlwapi.dll version 5.0 or later enthalten sein. Ich habe auf meinem System die Version 6.irgendwas. Nur leider finde ich die besagte Funktion in der DLL nicht mit dem Dependece Walker. Und Versuche sie auf "gut Glück" zu importieren:
Delphi-Quellcode:
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;
sind mit der Fehlermeldung:
Zitat:
System Error. Code: 127.
Die angegebene Prozedur wurde nicht gefunden.
fehlgeschlagen.

Dabei dachte ich, sie könnte sie ganz nützlich sein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

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

  Alt 2. Mai 2005, 05:40
Zitat:
C:\WINDOWS\system32>dumpbin /exports shlwapi.dll | find "SHMessageBoxCheck"
185 00057865 [NONAME] _SHMessageBoxCheckA@24
191 000577DB [NONAME] _SHMessageBoxCheckW@24
291 000579FA [NONAME] _SHMessageBoxCheckExA@28
292 0005797B [NONAME] _SHMessageBoxCheckExW@28

The SHMessageBoxCheck family of functions are apparently exported only
by ordinal.
Also: @SHMessageboxCheck := GetProcAddress(hLib, PChar(185));

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;
+}
+
Thomas
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#3

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

  Alt 2. Mai 2005, 09:31
Zitat von toms:
Zitat:
The SHMessageBoxCheck family of functions are apparently exported only
by ordinal.
Also: @SHMessageboxCheck := GetProcAddress(hLib, PChar(185));
Woher nimmt DUMPBIN diese Info? Liest es dazu die PDB oder die (vorhandene) LIB ein, oder benutzt es Debuginfos aus der DLL?

Würde mich mal interessieren. Die Formatierung der Funktionsnamen klingt nach LIB-Einlesen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

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

  Alt 2. Mai 2005, 11:21
ah, danke. allerdings bekomm eich jetzt eine AccessViolation:
Delphi-Quellcode:
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

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

  Alt 2. Mai 2005, 11:36
Zitat von Luckie:
ah, danke. allerdings bekomm eich jetzt eine AccessViolation
Ich glaube auch nicht, dass die Windows-Shell mit Delphis register-Aufrufkonvention zurecht kommt
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

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

  Alt 2. Mai 2005, 11:38
Zitat von NicoDE:
Zitat von Luckie:
ah, danke. allerdings bekomm eich jetzt eine AccessViolation
Ich glaube auch nicht, dass die Windows-Shell mit Delphis register-Aufrufkonvention zurecht kommt
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

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

  Alt 2. Mai 2005, 11:52
So geht's:
Delphi-Quellcode:
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;
Hat noch irgendjemand Verbesserungsvorschläge?

Code verbessert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Blutiger Anfänger
(Gast)

n/a Beiträge
 
#8

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

  Alt 2. Mai 2005, 17:05
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

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

  Alt 2. Mai 2005, 17:08
Zitat von Blutiger Anfänger:
1.Mit dem o.a. Quelltext hat der Button nur ein muedes zucken fuer mich uebrig.
was meisnt du? Bei mir geht es wunderbar.

Zitat:
2.Dumpbin liefert mir keine Ergebnisse.
Was ist DumpBin?

Zitat:
Muss zu diesem Quellcode noch irgendetwas hinzugefügt werden, ausser den Vorgaben, die durch die
Unit schon automatisch erfolgen ???
Nein.

Zitat:
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 !
Wenn sich das nicht expliziet auf die DLL aus dem Code bezieht, dann ist das Problem wohl genereller natur und hat hier nichts verloren.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Blutiger Anfänger
(Gast)

n/a Beiträge
 
#10

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

  Alt 2. Mai 2005, 17:23
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

und Danke
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 14  1 2311     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 05:04 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