为什么正确设置了开机启动,程序却起不来()

最近有一个需求,要在 windows 上设置一个 exe 开机启动。这个按照通常的做法,只需在注册表中添加一项即可实现。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
【为什么正确设置了开机启动,程序却起不来()】具体可参考:How to Add, Delete, Enable, or Disable Startup Items in Windows 10
写好代码后,把一个测试 exe 设置成开机启动,重启机器。测试 exe 顺利的开机重启了。一切都 ok 后,交个测试同事测试。
同事却发现开机启动无效。我把我的测试 exe 拷贝到他的机器上,却可以正常启动。这就很郁闷了,原来只有他设置的那个 exe 没办法开机启动。
开始的时候,我以为跟那个exe 的权限有关系,找了半天发现可能并不是。这个时候我想应该看看那个 exe 在开机后有没有执行过,由于那个 exe 是异地的一个同事开发的,所以也不太能很快的让他改代码来帮我测试。所以我就想能不能让 windows 监控程序的启动。最后找到可以这么做,只需在 windows 设置中设置一下就可以。
详见:How can I track what programs come and go on my machine?
设置好重启系统,发现那个exe 确实启动过,但是启动后立即就退出了,没有任何退出原因。
然后我就试了下我的一个稍微复杂点的 exe 是否可以开机启动。发现也不能,并且有错误提示,说一个配置文件不存在。
好吧,既然我的也不可以正常启动,那么我就可以快速的修改自己的代码来检查原因了,后来发现我那个不能读取的配置文件用的是相对目录。
如果我双击启动程序可以正常运行,但是开机启动却不可以。打印一下工作目录(work directory)发现并不是 exe 所在目录,而是 windows/system32 目录。可能问题就出在这里。网上查了下,说 windows 开机启动的 exe 工作目录都是 system32,没办法修改这一限制。
所以我在我的程序一运行就设置工作目录为 argv[0] 所在的目录。
测试了下发现就这是个问题。
用我同事那个 exe 测试也正常了。
其实是很简单的问题,记录一下。

    推荐阅读