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 10 von 14   « Erste     8910 1112     Letzte »    
Waldteufel
(Gast)

n/a Beiträge
 
#91

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

  Alt 6. Mai 2005, 13:32
Hi.

Bevor jetzt noch Stunden rumgerätselt wird, bin ich mal so nett und gebe euch den korrekten Code...

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(); // Initialisieren
  SetLastError(ERROR_SUCCESS); // Letzen Fehler löschen
  if SHMessageBoxCheckW(GetShellWindow(), 'Dies ist nur ein Testtext.', 'Und dies ist der Titel', MB_OK or MB_ICONINFORMATION, IDNO, '2A622957-D0A5-41CA-8571-898247531A2C') = -1 then // Rückgabwert ist -1 bei Fehler
  begin
    Writeln(GetLastError()); // Fehler ausgeben
    Readln;
  end;
end.
//edit : Ein Komma fehlte
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#92

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

  Alt 6. Mai 2005, 13:36
Zitat von marabu:
Warum spottest du? Ich brauche keinen Debugger um einen Fehler im Quelltext zu sehen!
Warum spottest du? Wir haben dich um eine Korrektur gebeten. Mehrfach!

Zitat von marabu:
Ich habe bereits gesagt, was du falsch machst. Fange den Rückgabewert ab und prüfe auf -1. Nur dann interessiert mich LastError.
Das hilft aber auch nichts, wenn die MessageBox() ganz simpel nicht angezeigt wird. Und so amateurhaft bin ich nun auch wieder nicht, daß ich nicht vorher SetLastError(ERROR_SUCCESS) setzen würde. Der Rückgabewert ist also irrelevant, weil der Fehler während des Aufrufs passiert sein muß.

Aber vielleicht kann ich ja dein "Interesse" mit einer Ausgabe, die da lautet "1400", dieses Programmes wecken:
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);
  if(-1 = SHMessageBoxCheckW(GetShellWindow(), 'Dies ist nur ein Testtext.',
    'Und dies ist der Titel', MB_OK or MB_ICONINFORMATION, IDNO,
    '2C622957-D0A5-41CA-8571-898247531A2C')) then
  begin
    Writeln(GetLastError());
  end
  else
    Writeln('Successful call');
  Readln;
end.
Ja, ich habe soeben den XP SP1 Rechner nochmal für unseren gefiederten Freund angeworfen und die Ausgabe bleibt stur bei 1400.

Dennoch hilft uns die Tatsache, daß -1 zurückgegeben wird, nicht den Fehler einzugrenzen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#93

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

  Alt 6. Mai 2005, 13:47
Hallo tommie-lie,

Zitat von tommie-lie:
Wie wär's, wenn du mal konstruktiv dazu beisteuerst, die allgemeine Dummheit zu beseitigen und mit deinem allumfassenden Wissen mit gottgleicher Gnade direkt auf den Fehler hinweist, und ihn dabei noch gleich korrigierst?
Ich hielt es nicht für angemessen einen korrigierten Quelltext zu posten, da ich glaubte durch meinen Hinweis auf den trivialen Fehler bereits geholfen zu haben. Das einzige was ich mir da eingehandelt habe sind Spott und Schimpfworte.

Ich verwende keine Emoticons, deshalb bemühe ich mich neutral zu schreiben. Du willst da etwas in meinem Beitrag lesen, was gar nicht da ist. Ich bin zu alt für sowas, ich könnte dein Großvater sein. Und ich bin kein Hobby-Programmierer. Ich ernähre mich und meine Familie seit 27 Jahren ausschließlich durch meine Programmierarbeit.

Ungnädige Grüße vom marabu
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#94

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

  Alt 6. Mai 2005, 13:48
Versuch's mal ohne GetShellWindow() (NULL und MB_TASKMODAL). Ansonsten würde ich es nicht aus einer Konsolenanwendung versuchen
(und irgendeine Initialisierung der Shell noch notwendig...?)
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#95

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

  Alt 6. Mai 2005, 13:56
Ich habe mal den hier versucht. Zwar Konsolenanwendung, aber alles was die VCL braucht ist initialisiert. (Die DFM ist beliebig).
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}
uses
  CommCtrl, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

{$R unit1.DFM}

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

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';

procedure TForm1.FormCreate(Sender: TObject);
var
  hWnd: THandle;
begin
  hWnd := Self.Handle;
  Writeln(Format('Window handle: %.8X', [hWnd]));
  SetLastError(ERROR_SUCCESS);
  if(-1 = SHMessageBoxCheckW(hWnd, 'Dies ist nur ein Testtext.',
    'Und dies ist der Titel', MB_OK or MB_ICONINFORMATION, IDNO,
    '2C622957-D0A5-41CA-8571-898247531A2C')) then
  begin
    Writeln(GetLastError());
  end
  else
    Writeln('Successful call');
  Readln;
end;

begin
  InitCommonControls();
  Form1 := TForm1.Create(nil);
  Form1.ShowModal();
end.
Man beachte die Anordnung der Calls, damit nachgewiesen sei, daß der Fehler definitiv im Aufruf selber liegt. Die Ausgabe bleibt auf dem fraglichen System weiterhin 1400.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#96

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

  Alt 6. Mai 2005, 14:03
Zitat von Mephistopheles:
Und so amateurhaft bin ich nun auch wieder nicht, daß ich nicht vorher SetLastError(ERROR_SUCCESS) setzen würde. Der Rückgabewert ist also irrelevant, weil der Fehler während des Aufrufs passiert sein muß.
Diese Implikation ist falsch, die Regeln sind laut API Dokumentation nunmal anders. Wer garantiert dir, dass LastError nach deiner Initialisierung nur dann verändert wird, wenn ein Fehler auftritt?

Sagst du mir bitte was folgendes Code-Fragment ausgibt, wenn du es in deinem Konsolprojekt ausführst?

Delphi-Quellcode:
var
  id: integer;
begin
  id := SHMessageBoxCheckW(0, 'Dies ist nur ein Testtext.',
    'Und dies ist der Titel', MB_OK or MB_ICONINFORMATION, IDNO,
    '2A622957-D0A5-41CA-8571-898247531A2C');
  if id = -1
    then Writeln('LastError = ', GetLastError())
    else WriteLn('ID = ', id);
  Readln;
end;
marabu
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#97

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

  Alt 6. Mai 2005, 14:29
Jungs, nun bleibt mal auf dem Teppich. Dass ein Rechner mit Windows XP SP 1 verkorkst sein kann, das kann ich noch einsehen und verstehen. Aber zwei verschiedene?


@marabu: Nichts für ungut, aber es geht einfach nur um die Tatsache, dass der Dialog auf Windows XP nicht angezeigt wird, wenn das SP 1 installiert ist. Sobald das SP2 drauf ist, erscheint er. Daran rätseln wir. Das hat mit schlechter Doku seitens Microsoft oder mit mehr oder weniger Erfahrung der hier Anwesenden nichts zu tun. Ob nun das Abfragen von "GetLastError" sinnvoll ist oder nicht, spielt auch erst mal keine Rolle.
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#98

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

  Alt 6. Mai 2005, 14:36
Zitat von marabu:
Wer garantiert dir, dass LastError nach deiner Initialisierung nur dann verändert wird, wenn ein Fehler auftritt?
Die Konventionen nach denen die Win32-API funktioniert. Ich weiß zumindest mit Bestimmtheit, daß der Fehler während des Aufrufes auftrat. Nicht zwangsläufig innerhalb dieser Funktion - ggf. auch in einer Unterfunktion, die von der fraglichen Funktion aufgerufen wird. Das steht außer Frage. Aber daß ein Fehler und welcher Fehler auftrat ist nachvollziehbar.

Zitat von marabu:
Sagst du mir bitte was folgendes Code-Fragment ausgibt, wenn du es in deinem Konsolprojekt ausführst?
LastError = 1400.

Damit du dich hier nicht veräppelt fühlst, hänge ich auch noch einen Screenshot ran (dort kannst du die Version von XP sehen, die Konsolenausgabe und die Zeit). Ich kann mir schon vorstellen, daß es dir genauso unglaublich erscheint wie uns anderen auch.
Miniaturansicht angehängter Grafiken
zwischenablage01_388.png  
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#99

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

  Alt 6. Mai 2005, 14:48
kommt man doch schonmal weiter:

ERROR_INVALID_WINDOW_HANDLE
1400


sollte man also schon nen richtiges handle übergeben...
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#100

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

  Alt 6. Mai 2005, 15:08
Wir haben auch schon richtige Handle übergeben und das Problem blieb das gleiche. Das ist es also nicht. (s.w.o.)

@marabu: Sorry, wenn du dich angegriffen fühltest. Ich habe mich nur gewundert, daß du plötzlich sagst es geht, obwohl mehrfach das Gegenteil nachgewiesen wurde.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 10 von 14   « Erste     8910 1112     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 00:31 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