2016-03-28 8 views
2

私は、現在の実行可能ファイルが置かれているディレクトリは、Application.Exenameを使用して見つけることができます。Delphi:アプリケーションを起動したショートカットはどこですか?

しかし、別のディレクトリのショートカットを使用してアプリケーションを起動したときは、ショートカットがあるディレクトリのアドレスを見つけることはできますか?そこにいくつかのファイルを作成したいのですか?

XE2の使用。どうもありがとう。

+1

私はあなたがコマンドライン引数で情報を渡す方が良いと思います。それ以外の場合は、ユーザにショートカットでアプリを起動させる必要がありますが、これは不必要な制限です。私はあなたが提案したことをするアプリを見つけたことはありません。私はそれが警告サインでなければならないと思う。あなたはそのようなアプリを見たことがありますか?なぜ標準的な場所の1つにデータを保存しないのですか? –

+0

@David Heffernan: "C:\ myprogram.exe" "C:\ thisdir \"のように、ディレクトリ名をパラメータ1としてターゲットに完全に渡していれば、ありがとうございます。パラメータ1に "%CD%"のようなものを与える? - 私は多くの変種を試しましたが、実際のディレクトリ名で%CD%を置き換えることはできません。 – Giomach

+0

それは動作しません。ディレクトリをハードコードします。なぜあなたはこのように穀物に逆らっていますか?あなたの目標は何ですか? –

答えて

8

あなたはSTARTF_TITLEISLINKNAMEフラグ付きでGetStartupInfoを使用していることを行うことができます。

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() 'を手動で使用していた)以前にそのフラグを聞いたことがないと言っていました。しかし実際には、リンクファイル自体へのパスを使用することは今まで役に立ちましたか?確かに、マイクロソフトはそれを利用可能にしていますが、他のソリューションが利用可能なときに実際に使用する必要がありますか?ただ言って。さらにコメントする必要はありません。 –