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):
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?
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.
Tags und Links windows winapi visual-studio-2015