如何使用注册表启动程序并更改当前工作目录?

11

我试图在这个目录中启动我制作的程序:

C:\example\example.exe -someargument

当计算机启动时,我尝试使用这个注册表项:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

键为:

Name: example
Type: REG_SZ
Data: "C:\example\example.exe -someargument"

但是我的程序还需要从目录C:\example获取文件,但由于当前的工作目录不同,无法找到它们。在注册表键值中是否有可能做到像这样的事情?

"cd C:\example\; example.exe -someargument"

那么它会改变目录吗?或者有更好的解决方案吗?

谢谢!


当你说“我制作了”,是指你写了example.exe吗?如果是,用的是哪种编程语言? - Simon Chadwick
5个回答

13

你可以在下一个注册表键下注册你的应用程序(就像Reg2Run工具所做的那样)

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths\example.exe

@="c:\example\example.exe"
Path="c:\AnotherPath"

使用System.Diagnostics.Run("example.exe");方法可以启动指定工作路径下的应用程序。

或者另一种方式是:使用C#编写一个启动器,您也可以使用PowerShell cmdlet进行相同操作。

var info = new System.Diagnostics.ProcessStartInfo(@"c:\example\example.exe", "-someargument")
{
    WorkingDirectory = @"c:\AnotherPath"
};
System.Diagnostics.Process.Start(info);

1
我认为这个答案并没有回答问题。指定“Path”提供了一个字符串,用于附加到PATH环境变量。它对当前工作目录没有任何影响。 - il--ya

6

应用程序启动时,请执行以下操作(这是C#,转换为C++):

    using System.IO;
:
:
    Environment.CurrentDirectory = Path.GetDirectoryName(Application.ExecutablePath);

这只是一段代码片段,提供指导。 "using" 语句只是在您的应用程序中没有它的情况下出现。是的,根据您的代码需要,可以完全限定显示的所有其他类名,但请不要因为过于吹毛求疵而对一个完全有效的解决方案进行贬低评价。那不是 SO 精神。 - Simon Chadwick

3

你还可以在文件夹中创建程序的快捷方式,并在注册表中引用此快捷方式:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
Name: example
Type: REG_SZ
Data: "C:\example\example.lnk

0
如果文件始终位于与您的应用程序相同的目录中,请使用Application.ExecutablePath来定位代码内的文件工作目录,然后无论如何都可以引用它们。

0
如果您需要从同一目录加载DLL,可以在下面创建子键example.exe
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

注册表键和定义 PATH REG_SZ 值为 example.exe


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接