我知道使用Application.Exename可以找到當前可執行文件所在的目錄。Delphi:啓動應用程序的快捷方式在哪裏?
但是,當應用程序在另一個目錄中使用快捷方式啓動?我可以找到THAT目錄的地址,快捷方式是,我想在那裏創建一些文件?
使用XE2。非常感謝。
我知道使用Application.Exename可以找到當前可執行文件所在的目錄。Delphi:啓動應用程序的快捷方式在哪裏?
但是,當應用程序在另一個目錄中使用快捷方式啓動?我可以找到THAT目錄的地址,快捷方式是,我想在那裏創建一些文件?
使用XE2。非常感謝。
你可以做,使用GetStartupInfo與STARTF_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文件)。
我從來沒有聽說過這個功能。什麼時候這會很有用,而不是設置應用程序的當前工作目錄的快捷方式?捷徑可以移動,這就是爲什麼一個人不想依賴CWD?如果應用程序是以代碼而不是快捷方式啓動的話會怎麼樣?或者通過具有明確的「開始」路徑的快捷方式啓動?知道使用哪條路徑會變得更復雜一些。如果使用了'STARTF_TITLEISLINKNAME',我想你可以使用'IShellLink'來加載快捷方式並檢查它的'GetWorkingDirectory()'方法,如果沒有設置,則回退到快捷方式的路徑。 –
@Remy:它在鏈接的MSDN頁面中有記錄。它允許應用程序通過查詢啓動信息來確定它是否從快捷方式啓動。我從來沒有用過它,但MS使它可用。它在很長一段時間裏都沒有記錄,但是大衛在一個現在被刪除的評論中指出現在是這樣。 –
是的,我閱讀了文檔。我只是說我在今天之前從來沒有聽說過這個標誌(現在誰曾經手動使用過'GetStartupInfo()'?)。但是真的,使用鏈接文件本身的路徑有用嗎?當然,微軟可以提供它,但是當其他解決方案可用時,誰真的需要使用它?只是說。無需進一步評論。 –
我想你最好在命令行參數中傳遞信息。否則,您會強制用戶使用快捷方式啓動您的應用程序,這是一個不必要的限制。我從來沒有遇到過這樣的應用程序,它可以滿足您的要求。我認爲這應該是一個警告信號。你見過這樣的應用程序嗎?你爲什麼不把數據存儲在標準的地方? –
@David Heffernan:謝謝,現在正在工作,只要我將目錄名全部作爲參數1傳遞給目標,如:「C:\ myprogram.exe」「C:\ thisdir \」但是這是不可能的給參數1如「%CD%」之類的東西? - 我嘗試了很多變體,但不能用實際的目錄名稱替換%CD%。 – Giomach
這是行不通的。硬編碼目錄。你爲什麼以這種方式反對穀物?你的目標是什麼? –