STARTUPINFO.wShowWindow ist 0, wenn Visual Studio ausgeführt wird

8

Ich stolperte über ein Problem beim Debuggen eines Features in einem Open-Source-Notepad-Ersatz namens Notepad2 (genauer gesagt, ein neueres Fork namens Notepad2-mod ).

Er hat ein Flag /u , das bewirkt, dass sich die App unter Administratorrechte neu startet (mit runas Verb mit ShellExecute). Der Code sieht so aus (kurz geschnitten):

%Vor%

Aus irgendeinem Grund, wenn ich dies von Visual Studio gestartet habe (mit oder ohne einen angehängten Debugger), würde das Hauptfenster des erhöhten untergeordneten Prozesses einfach nicht angezeigt! Es würde im Prozess-Explorer erscheinen, hatte aber keine sichtbaren Fenster.

Bei der Untersuchung stellte ich fest, dass das nCmdShow , das an den untergeordneten Prozess ' WinMain übergeben wurde, 0 war (was SW_HIDE entspricht), wenn es von Visual Studio gestartet wurde! Dieser Wert wurde anschließend an ShowWindow übergeben und deshalb wurde er nicht angezeigt.

Beim Starten von einer cmd-Shell hat alles funktioniert.

Bei weiteren Untersuchungen stellte sich heraus, dass der Wert von si.wShowWindow , der durch einen Aufruf von GetStartupInfo erhalten wurde, 0 war, wenn er in VS ausgeführt wurde, aber von einem cmd gestartet wurde:

Laut STARTUPINFO MSDN-Eintrag , Der Wert für wShowWindow sollte mit dem Wert von nCmdShow übereinstimmen, wenn dwFlags STARTF_USESHOWWINDOW enthält. In beiden Fällen (Start von VS und cmd) war der Wert für dwFlags jedoch 0.

Also, ist das ein Problem mit VS oder halte ich es einfach falsch?

    
Igal Tabachnik 30.04.2016, 10:46
quelle

1 Antwort

8

Ich schreibe das hier auf, es ist ein ziemlich toller Bug. Es ist spezifisch für die Debugging-Engine VS2015, es ist ziemlich berüchtigt dafür, ziemlich viele Bugs zu haben. Etwas, das du selbst sehen kannst, indem du es deaktivierst. Werkzeuge & gt; Optionen & gt; Debugging & gt; Allgemein & gt; Aktivieren Sie die Option "Native Kompatibilitätsmodus verwenden". Das zwingt eine ältere Debuggine, verwendet zu werden, Sie erhalten jetzt konsistent STARTUPINFO.nCmdShow == SW_SHOWNORMAL.

Es gibt einen kleinen Eckfall, um zu begründen, dass dies beabsichtigt war, blindlings dem Hinweis nCmdShow zu folgen, ist nicht ratsam. Es ist ein Malware-Angriffsvektor, der es ermöglicht, ein Programm zu starten, ohne dass der Benutzer es bemerkt. Viele Programme ignorieren absichtlich SW_HIDE, keine sehr intuitive Sache und sehr leicht zu übersehen. Sie benötigen ein Glas, das weit über halb voll ist, um diese Interpretation zu machen, aber das Argument nCmdShow für WinMain () ist das, was normalerweise verwendet wird, und es ist korrekt.

Dies ist auch die Problemumgehung, die Sie verwenden können. Natürlich sollten Sie sich in diesem speziellen Fall niemals auf den Startwert verlassen und SW_SHOWNORMAL oder SW_SHOWMAXIMIZED je nach dem aktuellen Status des Hauptfensters von Notepad ++ übergeben.

Also stimme ich Bug, benutze connect.microsoft.com, um es zu melden. Setzen Sie einen Link auf den Feedback-Artikel in einem Kommentar und wir werden dafür stimmen.

    
Hans Passant 30.04.2016, 14:16
quelle