自动运行 Delphi 程序运行在 C10=]
Autorunning Delphi Programm runs in C:\windows\system32
我写了一个应用程序,启动时应该是 运行。windows。
我使用此代码使用复选框来决定启动时是否 运行s:
// d('randomString'); -> this is a function which adds text to a memo for debugging purposes
// GetDosOutput is a function to run cmd commands and get the output of them piped in a memo
function GetRegistryValue(KeyName: string): string;
var
Registry: TRegistry;
begin
Registry := TRegistry.Create(KEY_READ);
try
Registry.RootKey := HKEY_CURRENT_USER;
// False weil kein Eintrag erzeugt werden soll, sofern er nicht vorhanden ist.
Registry.OpenKey(KeyName, False);
result := Registry.ReadString('SomeRandomAppIWantToRun');
finally
Registry.Free;
end;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
var
reg: TRegistry;
begin
if CheckBox1.Checked = true then
begin
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False);
if ValueExists('SomeRandomAppIWantToRun') then
begin
d('Wert existiert');
if lowercase(Application.ExeName)
= lowercase
(GetRegistryValue('\Software\Microsoft\Windows\CurrentVersion\Run'))
then
begin
d('Autostart entry exists and is correct.');
end
else
begin
d('wrong value exists... will be deleted and recreated!');
GetDosOutput
('reg delete HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v SomeRandomAppIWantToRun /f');
GetDosOutput
('REG ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /f /v SomeRandomAppIWantToRun /t REG_SZ /d C:\temp\SomeRandomAppIWantToRun.exe');
end;
end
else
begin
d('Autostart entry doesnt exists and will be created now.');
GetDosOutput
('REG ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /f /v SomeRandomAppIWantToRun /t REG_SZ /d C:\temp\SomeRandomAppIWantToRun.exe');
end;
except
showmessage
(d('Exception in Registry - stuff isnt working'));
end;
end
else
begin
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False);
if ValueExists('SomeRandomAppIWantToRun') then
begin
d('Wert existiert');
if lowercase(Application.ExeName)
= lowercase
(GetRegistryValue('\Software\Microsoft\Windows\CurrentVersion\Run'))
then
begin
d('correct Autostart entry will be deleted!');
GetDosOutput
('reg delete HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v SomeRandomAppIWantToRun /f');
end
else
begin
d('wrong startup value... will be deleted and not recreated!');
GetDosOutput
('reg delete HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v SomeRandomAppIWantToRun /f');
end;
end
else
begin
showmessage('Autostart entry doesnt exist and thats fine.');
end;
except
showmessage
(d('something didnt work well....'));
end;
end;
end;
它在启动我的计算机时成功启动,但是..它似乎在 C:\windows\system32 中工作,我不知道为什么..
我将应用程序(.exe 文件)放在 C:\temp 中,它应该在 C:\temp 中执行重命名文件夹和删除文件等操作,但为此它需要在 C: 中 运行 \temp 所以它可以很容易地例如 运行 一个位于那里的批处理文件,它本身需要考虑它的 运行ning 在 C:\temp.
当我在 %appdata%\Microsoft\Windows\Start Menu\Programs\Startup 中创建快捷方式时,它工作正常,
但我个人不想在某些目录中创建快捷方式,但喜欢在注册表中创建快捷方式
It successfulls starts while booting up my computer, but.. it seems to be working in C:\windows\system32 and I dont know why..
这是正常现象。当 Windows 是来自 Run
注册表项的 运行ning 应用程序时,它们会继承 Shell 的工作目录,恰好是 System32 文件夹。
您的程序不应依赖工作目录在 运行 时是任何特定值。如果您想使用相对于您的 EXE 当前位置的文件路径,那么您应该在 运行 时间使用 Application.ExeName
或 ParamStr(0)
检索您的 EXE 的完整路径,然后使用 ExtractFilePath()
去掉文件名。然后,您可以根据需要使用生成的字符串创建其他文件的路径。
如果您在程序 运行 时绝对需要依赖工作目录作为特定值,请参阅 Use registry to startup a program, and also change the current working directory? 解决方法。
When I create a shortcut in %appdata%\Microsoft\Windows\Start Menu\Programs\Startup it works fine
这是因为快捷方式有自己的工作目录。默认情况下,它是与快捷方式目标相同的文件夹。但是,如果您要进入该快捷方式的属性并将其 Start in
字段设置为不同的文件夹,您会看到您的程序行为异常,就像它从 Run
注册表项启动时一样。
我写了一个应用程序,启动时应该是 运行。windows。
我使用此代码使用复选框来决定启动时是否 运行s:
// d('randomString'); -> this is a function which adds text to a memo for debugging purposes
// GetDosOutput is a function to run cmd commands and get the output of them piped in a memo
function GetRegistryValue(KeyName: string): string;
var
Registry: TRegistry;
begin
Registry := TRegistry.Create(KEY_READ);
try
Registry.RootKey := HKEY_CURRENT_USER;
// False weil kein Eintrag erzeugt werden soll, sofern er nicht vorhanden ist.
Registry.OpenKey(KeyName, False);
result := Registry.ReadString('SomeRandomAppIWantToRun');
finally
Registry.Free;
end;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
var
reg: TRegistry;
begin
if CheckBox1.Checked = true then
begin
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False);
if ValueExists('SomeRandomAppIWantToRun') then
begin
d('Wert existiert');
if lowercase(Application.ExeName)
= lowercase
(GetRegistryValue('\Software\Microsoft\Windows\CurrentVersion\Run'))
then
begin
d('Autostart entry exists and is correct.');
end
else
begin
d('wrong value exists... will be deleted and recreated!');
GetDosOutput
('reg delete HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v SomeRandomAppIWantToRun /f');
GetDosOutput
('REG ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /f /v SomeRandomAppIWantToRun /t REG_SZ /d C:\temp\SomeRandomAppIWantToRun.exe');
end;
end
else
begin
d('Autostart entry doesnt exists and will be created now.');
GetDosOutput
('REG ADD HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /f /v SomeRandomAppIWantToRun /t REG_SZ /d C:\temp\SomeRandomAppIWantToRun.exe');
end;
except
showmessage
(d('Exception in Registry - stuff isnt working'));
end;
end
else
begin
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False);
if ValueExists('SomeRandomAppIWantToRun') then
begin
d('Wert existiert');
if lowercase(Application.ExeName)
= lowercase
(GetRegistryValue('\Software\Microsoft\Windows\CurrentVersion\Run'))
then
begin
d('correct Autostart entry will be deleted!');
GetDosOutput
('reg delete HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v SomeRandomAppIWantToRun /f');
end
else
begin
d('wrong startup value... will be deleted and not recreated!');
GetDosOutput
('reg delete HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v SomeRandomAppIWantToRun /f');
end;
end
else
begin
showmessage('Autostart entry doesnt exist and thats fine.');
end;
except
showmessage
(d('something didnt work well....'));
end;
end;
end;
它在启动我的计算机时成功启动,但是..它似乎在 C:\windows\system32 中工作,我不知道为什么.. 我将应用程序(.exe 文件)放在 C:\temp 中,它应该在 C:\temp 中执行重命名文件夹和删除文件等操作,但为此它需要在 C: 中 运行 \temp 所以它可以很容易地例如 运行 一个位于那里的批处理文件,它本身需要考虑它的 运行ning 在 C:\temp.
当我在 %appdata%\Microsoft\Windows\Start Menu\Programs\Startup 中创建快捷方式时,它工作正常, 但我个人不想在某些目录中创建快捷方式,但喜欢在注册表中创建快捷方式
It successfulls starts while booting up my computer, but.. it seems to be working in C:\windows\system32 and I dont know why..
这是正常现象。当 Windows 是来自 Run
注册表项的 运行ning 应用程序时,它们会继承 Shell 的工作目录,恰好是 System32 文件夹。
您的程序不应依赖工作目录在 运行 时是任何特定值。如果您想使用相对于您的 EXE 当前位置的文件路径,那么您应该在 运行 时间使用 Application.ExeName
或 ParamStr(0)
检索您的 EXE 的完整路径,然后使用 ExtractFilePath()
去掉文件名。然后,您可以根据需要使用生成的字符串创建其他文件的路径。
如果您在程序 运行 时绝对需要依赖工作目录作为特定值,请参阅 Use registry to startup a program, and also change the current working directory? 解决方法。
When I create a shortcut in %appdata%\Microsoft\Windows\Start Menu\Programs\Startup it works fine
这是因为快捷方式有自己的工作目录。默认情况下,它是与快捷方式目标相同的文件夹。但是,如果您要进入该快捷方式的属性并将其 Start in
字段设置为不同的文件夹,您会看到您的程序行为异常,就像它从 Run
注册表项启动时一样。