2017-03-25 3 views
0

Ich gebe meinen HWND an einen Unterprozess weiter, damit er mir Nachrichten über seinen Fortschritt schicken kann. Gelegentlich erhalte ich nie irgendwelche Nachrichten vom Unterprozess. Bei der Untersuchung habe ich festgestellt, dass GetSafeHwnd(), von dem ich an den Subprozess übergebe, Werte zurückgibt, die ich nicht erwarte.Ist es normal, dass ein High-Bit gesetzt ist?

Zum Beispiel: 0xffffffffa5400382

auf dieser Grundlage kann ich wohl folgern, dass ich nicht richtig richtig, diesen Wert zu/von einem int64/string umgewandelt wird. Ich kann das reparieren. Aber was ich seltsam finde ist, dass dieses Hwnd einfach nicht richtig aussieht?

Gibt es Szenarien, in denen ein HWND sein High-Bit setzen kann? Ist das ein normales Fenster, oder gibt es etwas Besonderes an dem Hwnd, so zu enden?

Ich bin in C++, dies ist ein CDialog-basierten Anwendungsfenster.

+1

Ist der Prozess 32 oder 64bit? Die Griffe können beliebige Bits gesetzt haben, das hohe Bit ist nichts besonderes. –

+0

Beide Prozesse sind 64-Bit. –

Antwort

2

Das Ergebnis, das Sie sehen, stammt von sign extension des Handle-Werts zu einer 64-Bit-Ganzzahl. Der tatsächliche Handle-Wert ist 0xa5400382, weil handle values are always in the 32-bit range, auch wenn der Prozess 64-Bit ist!

Sie sollten stattdessen die HWND zu std::uint32_t umwandeln und diese in Zeichenfolge (oder umgekehrt) konvertieren.

Convert HWND zu wstring:

HWND hwnd = GetSafeHwnd(); 
std::uint32_t handleValue = reinterpret_cast<std::uint32_t>(hwnd); 
std::wstring handleValueStr = std::to_wstring(handleValue); 

Umrechnen in HWND wstring:

try 
{ 
    std::uint32_t handleValue = std::stoul(someString); 
    HWND handle = reinterpret_cast<HWND>(handleValue); 
} 
catch(std::exception& e) 
{ 
    // Handle string conversion error 
} 

Der try/catch-Block erforderlich ist, da std::stoul() Ausnahmen auslösen kann, wenn die Konvertierung fehlschlägt.

+0

Interessant @ zett42. Ich kann das nicht auf meinem Computer reproduzieren, also verwende ich Logging. Der Code, der den HWND protokolliert, ist wie folgt: Ich hatte nicht gesehen, dass die Werte des Handles immer 32 Bit sind und dass sie in dieser Hinsicht sicher abgeschnitten werden können. Ich werde auf die nächste Instanz achten, die unser Code mit einem Fensterhandle behandelt, das ziemlich groß zu sein scheint. –

+0

@Leo Bitte akzeptieren Sie die Antwort, wenn es für Sie nützlich ist, indem Sie auf das graue Häkchen klicken. – zett42

+0

Danke für Ihre Kommentare @ zett42. Ich werde es als eine Antwort markieren, sobald ich das Problem verstehe, das ich besser sehe. Leider kann ich in diesen Kommentaren keinen Wagenrücklauf eingeben (Stupid Edge). Der Code, mit dem ich mich anmelde, ist wie folgt: uint64 nOwnderHwnd = (uint64) GetSafeHwnd(); Log ("% I64x", nOwnerHwnd); Ich würde erwarten, dass diese Zeile keinen 32-Bit-Signed-Carry ausführt? Aber was ich gesehen habe, ist wie folgt: "ffffffffe22400c8". Wenn ich es in "% I64u" ändere, bekomme ich das "18446744073208594632". –

Verwandte Themen