繁体   English   中英

Win32应用程序无法在启动时运行

[英]Win32 application doesn't run on startup

我在Visual Studio 2015中创建了一个C ++ Win32应用程序。我的目标是使其在启动时运行。 我在注册表中添加了一个新条目(HKCU \\ Software \\ Microsoft \\ Windows \\ CurrentVersion \\ Run)。 由于未知的原因,它不起作用。

但是,它正确显示在“任务管理器”的“启动”选项卡中,而不正确显示在“进程”选项卡中,这意味着它根本无法运行。 我试图将其包装在蝙蝠文件中。 蝙蝠运行了,但是应用程序似乎在启动时失败了(或者完全被忽略了,我无法确切地说出)。 如果我从Program Files目录手动启动,它将正常运行。

这是一个来自朋友的旧Visual项目,在当前Visual(2015)中进行了转换。 如果我从头开始创建一个新项目,它将起作用。 但是没有这种行为的原因。

最后的想法 -我成功地解决了我的问题。 我的程序找不到SQLite文件,因为Windows在启动时启动的任何程序都使用“ c:\\ Windows \\ System32”作为当前目录。 我只是应用了Marko Popovic的解决方案。 这只是一个简单的当前目录问题。

PS -Marko Popovic的解决方案很好,但是@IInspectable警告此方法可能会出现传入的错误。 建议仅使用完全限定的路径名​​而不更改dir

使用“运行”键启动应用程序时,其工作目录不是其映像文件(* .exe)所在的目录。 您可以通过在主函数的最开始处调用Win32函数SetCurrentDirectory来更改此设置。 这是解决方案的框架:

// Use GetModuleFileName to retrieve path of the executable file
TCHAR pszPathToSelf[MAX_PATH];
DWORD dwPathLength = GetModuleFileName(NULL, pszPathToSelf, MAX_PATH);
if(dwPathLength > 0)
{
    // Code that extracts directory path from pszPathToSelf and places it into variable pszNewWorkingDirectory of type TCHAR
    ...

    BOOL bSuccess = SetCurrentDirectory(pszNewWorkingDirectory);
    if(0 == bSuccess)
    {
    // SetCurrentDirectory failed for some reason, handle how you see fit
    ....
    }
} 

这样,您的函数将更改其工作目录并加载必要的DLL。

编辑:正如用户IInspectable指出的那样,以上方法在默认情况下将不起作用,而仅在某些特殊情况下有效。 更好的方法是在“ App Paths注册表项下注册您的应用App Paths 如果您的应用程序名为my_app.exe ,请创建以下注册表项: HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\my_app.exe ,然后创建一个名为PathREG_SZ值,该值将包含保存my_app.exe目录的路径my_app.exe

有关更多详细信息,请参见下面的MSDN页面:

https://msdn.microsoft.com/en-us/library/windows/desktop/ee872121%28v=vs.85%29.aspx

对不起,最初的错误!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM