2016-03-28 90 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()'?)。但是真的,使用鏈接文件本身的路徑有用嗎?當然,微軟可以提供它,但是當其他解決方案可用時,誰真的需要使用它?只是說。無需進一步評論。 –

相關問題