Mi sono imbattuto in un problema mentre eseguivo il debug di una funzionalità in una sostituzione Notepad open-source denominata Notepad2 (in particolare, un fork più recente chiamato Notepad2-mod).STARTUPINFO.wShowWindow è 0 quando è in esecuzione da Visual Studio
Ha una bandiera /u
che provoca il riavvio dell'app in Privilegi amministrativi (utilizzando runas
con ShellExecute). Il codice è simile al seguente (ottenuto per brevità):
STARTUPINFO si;
SHELLEXECUTEINFO sei;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
ZeroMemory(&sei,sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
...
sei.lpVerb = L"runas";
sei.lpFile = lpArg1;
sei.lpParameters = lpArg2;
sei.nShow = si.wShowWindow;
ShellExecuteEx(&sei);
Per qualche ragione, se ho lanciato questo da Visual Studio (con o senza un debugger), il processo figlio elevata la finestra principale sarebbe semplicemente non vedere! Apparirebbe in Process Explorer, ma non aveva finestre visibili.
Dopo alcune indagini, ho capito che la nCmdShow
passato al processo figlio WinMain
era di 0 (che corrisponde al SW_HIDE
), quando ha iniziato da Visual Studio! Questo valore è stato successivamente passato a ShowWindow
ed è per questo che non è stato mostrato.
Quando si prova a lanciare questo da una shell cmd, tutto ha funzionato correttamente.
ulteriori indagini, si è scoperto che il valore di si.wShowWindow
, ottenuto da una chiamata a GetStartupInfo
era 0 quando viene eseguito in VS, ma era 1 quando lanciato da un cmd:
Secondo STARTUPINFO MSDN entry, il valore per wShowWindow
deve corrispondere al valore di nCmdShow
se contiene STARTF_USESHOWWINDOW
. Tuttavia, in entrambi i casi (avvio da VS e cmd), il valore per dwFlags
era 0.
Quindi, si tratta di un problema con VS o sto semplicemente sbagliando?
Per inciso, non lo so, perché fa anche la differenza quali valori vengono passati attraverso l'argomento 'STARTUPINFO' o' wShowWindow'. Viene ignorato, la prima volta che un'applicazione chiama [ShowWindow] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548.aspx). Suppongo che Notepad2 faccia qualcosa di "insolito", ad es.chiamare 'ShowWindow' più di una volta per la sua finestra principale dell'applicazione. – IInspectable
Il valore di 'wShowWindow' è stato passato in' sei.nShow' e successivamente nel WinMain del processo figlio. Poiché il valore era 0, anche il parametro 'nCmdShow' di WinMain era 0. Questo parametro è stato quindi passato a CreateWindow, quindi è stato effettivamente chiamato con SW_HIDE. Dato quello che @HansPassant ha detto di seguito, è probabilmente una cattiva pratica usare direttamente nCmdShow, ma è quello che ha fatto Notepad2. –
Poiché non esiste alcuna mappatura diretta tra [Stile finestra] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632600.aspx) e i valori per * nCmdShow * sono disponibili per [ShowWindow] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548.aspx), direi che il bug si trova davvero in Notepad2 (e Visual Studio, ma è in qualche modo irrilevante). A meno che non ci sia un motivo sorprendente per Notepad2 per usare la bandiera per quello che non dovrebbe essere usato, suggerirei di cambiarlo. – IInspectable