Что происходит, когда я дважды щелкаю исполняемый файл, технически - PullRequest
6 голосов
/ 30 марта 2019

ТЛ; др

Я пытаюсь понять разницу запуска программы напрямую, дважды щелкнув исполняемый файл по сравнению с запуском через терминал или программно через CreateProcess в Windows 10.


длинная версия

Поскольку это моя проблема, выполнение старой игры (около 2003 года с использованием D3D8) с помощью двойного щелчка в Windows 10 работает нормально. Выполнение игры через исполняемый день второго дня (также около 2003 г.) с использованием CreateProcess, кажется, иногда работает нормально.

Но выполнение его через мой новый исполняемый файл golang никогда не работает. Вместо этого я получаю очень маленький экран. Поэтому я хочу понять, в чем техническая разница.

Для справки, мой код golang выглядит так: (маленький экран)

cmd := exec.Command(filepath.Join(".", "Game.exe"))
err := cmd.Start()

Разборка вторичного исполняемого файла дает мне следующее: (обычный экран)

CPU Disasm
Address   Hex dump          Command                                  Comments
004043AF  |.  51            PUSH ECX                                 ; /pProcessInformation = 59C7F521 -> {hProcess=???,hThread=???,ProcessID=???,ThreadID=???}
004043B0  |.  52            PUSH EDX                                 ; |pStartupInfo => OFFSET LOCAL.16
004043B1  |.  68 28E54000   PUSH OFFSET 0040E528                     ; |CurrentDirectory = "."
004043B6  |.  50            PUSH EAX                                 ; |pEnvironment => NULL
004043B7  |.  50            PUSH EAX                                 ; |CreationFlags => 0
004043B8  |.  6A 01         PUSH 1                                   ; |InheritHandles = TRUE
004043BA  |.  50            PUSH EAX                                 ; |pThreadSecurity => NULL
004043BB  |.  50            PUSH EAX                                 ; |pProcessSecurity => NULL
004043BC  |.  68 10E54000   PUSH OFFSET 0040E510                     ; |CommandLine = "Game.exe"
004043C1  |.  50            PUSH EAX                                 ; |ApplicationName => NULL
004043C2  |.  FF15 8CB04000 CALL DWORD PTR DS:[<&KERNEL32.CreateProc ; \KERNEL32.CreateProcessA

Когда я говорю, что игра представляет собой крошечный экран, он выглядит так:

enter image description here

по сравнению с этим, когда он выполняется напрямую двойным щелчком: (не обращайте внимания на то, что он черный, это просто обычный запуск)

enter image description here


Дополнительная информация: На самом деле проблема существует только в Windows 10. Windows 7 полностью в порядке.

Для Windows 10 единственный способ сделать его обычным экраном - использовать эту настройку:

enter image description here

Когда это используется, я получаю обычный экран при использовании двойного щелчка или вторичного исполняемого файла. Но это все еще маленький экран в моем приложении Golang.

...