2016-03-28 48 views
2

我知道使用Application.Exename可以找到当前可执行文件所在的目录。Delphi:启动应用程序的快捷方式在哪里?

但是,当应用程序在另一个目录中使用快捷方式启动?我可以找到THAT目录的地址,快捷方式是,我想在那里创建一些文件?

使用XE2。非常感谢。

+1

我想你最好在命令行参数中传递信息。否则,您会强制用户使用快捷方式启动您的应用程序,这是一个不必要的限制。我从来没有遇到过这样的应用程序,它可以满足您的要求。我认为这应该是一个警告信号。你见过这样的应用程序吗?你为什么不把数据存储在标准的地方? –

+0

@David Heffernan:谢谢,现在正在工作,只要我将目录名全部作为参数1传递给目标,如:“C:\ myprogram.exe”“C:\ thisdir \”但是这是不可能的给参数1如“%CD%”之类的东西? - 我尝试了很多变体,但不能用实际的目录名称替换%CD%。 – Giomach

+0

这是行不通的。硬编码目录。你为什么以这种方式反对谷物?你的目标是什么? –

回答

8

你可以做,使用GetStartupInfoSTARTF_TITLEISLINKNAME标志:

const 
    STARTF_TITLEISLINKNAME = $800; 

function GetShortcutName(out LinkName: string): Boolean; 
var 
    si: TStartupInfo; 
begin 
    Result := False; 
    FillChar(si, SizeOf(TStartupInfo), 0); 
    GetStartupInfo(si); 
    if (si.dwFlags and STARTF_TITLEISLINKNAME) <> 0 then 
    begin 
    Result := True; 
    LinkName := si.lpTitle; 
    end; 
end; 

测试代码(与XE8和Delphi 10西雅图Win7的64测试 - 而不是在Win8的测试或10):

program GetShortCutTest; 

{$APPTYPE CONSOLE} 

uses 
    System.SysUtils, 
    Windows; 

var 
    sLink: string; 

begin 
    if GetShortcutName(sLink) then 
    WriteLn('Shortcut: ' + sLink) 
    else 
    WriteLn('Not run from shortcut.'); 

    ReadLn; 
end. 

您可以通过运行测试应用程序(它将显示“不从快捷方式运行”)测试它,然后创建测试应用程序的快捷方式并执行该快捷方式(然后显示“快捷方式:”和名称。 lnk文件)。

+0

我从来没有听说过这个功能。什么时候这会很有用,而不是设置应用程序的当前工作目录的快捷方式?捷径可以移动,这就是为什么一个人不想依赖CWD?如果应用程序是以代码而不是快捷方式启动的话会怎么样?或者通过具有明确的“开始”路径的快捷方式启动?知道使用哪条路径会变得更复杂一些。如果使用了'STARTF_TITLEISLINKNAME',我想你可以使用'IShellLink'来加载快捷方式并检查它的'GetWorkingDirectory()'方法,如果没有设置,则回退到快捷方式的路径。 –

+0

@Remy:它在链接的MSDN页面中有记录。它允许应用程序通过查询启动信息来确定它是否从快捷方式启动。我从来没有用过它,但MS使它可用。它在很长一段时间里都没有记录,但是大卫在一个现在被删除的评论中指出现在是这样。 –

+0

是的,我阅读了文档。我只是说我在今天之前从来没有听说过这个标志(现在谁曾经手动使用过'GetStartupInfo()'?)。但是真的,使用链接文件本身的路径有用吗?当然,微软可以提供它,但是当其他解决方案可用时,谁真的需要使用它?只是说。无需进一步评论。 –

相关问题