Win32应用程序在启动时不运行

时间:2015-11-19 15:38:04

标签: c++ winapi visual-studio-2015

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

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

这是来自朋友的旧视觉项目,它在当前的Visual(2015)中进行了转换。如果我从头开始创建一个新项目,它就可以了。但是没有理由这样做。

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

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

1 个答案:

答案 0 :(得分:2)

使用" Run"启动应用程序时key,其工作目录不是其图像文件(* .exe)所在的目录。您可以通过在main函数的最开头调用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注册表项下注册您的应用程序。如果您的应用程序名为my_app.exe,请创建以下注册表项: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\my_app.exe 然后创建一个名为REG_SZ的{​​{1}}值,该值将包含保存Path的目录的路径。

有关详细信息,请参阅以下MSDN页面:

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

抱歉最初的错误!