Delphi-PRAXiS
Seite 1 von 14  1 2311     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Wo ist oder wie heißt die Funktion: SHMessageBoxCheck? (https://www.delphipraxis.net/45208-wo-ist-oder-wie-heisst-die-funktion-shmessageboxcheck.html)

Luckie 2. Mai 2005 04:36


Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
 
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.

toms 2. Mai 2005 05:40

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
 
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;
+}
+

Mephistopheles 2. Mai 2005 09:31

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

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.

Luckie 2. Mai 2005 11:21

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
 
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;
:gruebel:

NicoDE 2. Mai 2005 11:36

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

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 :)

Luckie 2. Mai 2005 11:38

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

Zitat von NicoDE
Zitat:

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 :)

:wall:

Luckie 2. Mai 2005 11:52

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
 
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.

Blutiger Anfänger 2. Mai 2005 17:05

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:

Luckie 2. Mai 2005 17:08

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

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.

Blutiger Anfänger 2. Mai 2005 17:23

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.
Seite 1 von 14  1 2311     Letzte »    

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