从技术上双击可执行文件会发生什么

maj*_*rif 6 c++ windows createprocess go

tl; dr

我试图了解通过双击可执行文件与通过终端或CreateProcess在Windows 10中以编程方式运行直接运行程序的区别。


长版

因为这是我的问题,所以通过双击Windows 10执行旧游戏(大约在2003年使用D3D8)是可以的。通过使用的第二个可执行文件(大约在2003年)执行游戏CreateProcess有时看起来还可以。

但是通过我的新golang可执行文件执行该命令将无法正常工作。我得到一个非常小的屏幕。所以我想了解技术上的区别。

供参考,我的golang代码如下:(小屏幕)

cmd := exec.Command(filepath.Join(".", "Game.exe"))
err := cmd.Start()
Run Code Online (Sandbox Code Playgroud)

拆解辅助可执行文件会给我以下信息:(正常屏幕)

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
Run Code Online (Sandbox Code Playgroud)

当我说游戏是一个小屏幕时,它显示如下:

在此处输入图片说明

相对于直接通过双击执行它:(不要介意它是黑色的,只是正常的启动)

在此处输入图片说明


附加信息:实际上,该问题仅存在于Windows 10中。Windows 7完全正常。

对于Windows 10,使其变为正常屏幕的唯一方法是使用此设置:

在此处输入图片说明

使用该选项时,使用双击或辅助可执行文件时,我可以看到正常屏幕。但是在我的Golang应用程序上,它的屏幕仍然很小。