2016-03-28 21 views
2

Geçerli yürütülebilir dosyanın bulunduğu dizinin Application.Exename kullanılarak bulunabileceğinin farkındayım.Delphi: Uygulamayı başlatan kısayol nerede?

Ancak, uygulama başka bir dizinde kısayol kullanılarak başlatıldığında? Bazı dosyaları oluşturmak istediğim kısayolun bulunduğu THAT dizininin adresini bulabilir miyim?

XE2'yi kullanma. Çok teşekkürler.

+1

Bilgiyi komut satırı argümanında iletmekten daha iyi olursun. Aksi halde, kullanıcıları uygulamanızı bir kısayolla başlatmaya zorlarsınız ve bu gereksiz bir sınırlamadır. Teklif ettiğin şeyi yapan bir uygulamaya rastlamadım. Bunun bir uyarı işareti olması gerektiğini düşünüyorum. Böyle bir uygulama gördün mü? Verileri neden standart yerlerden birinde saklamıyorsunuz? –

+0

@David Heffernan: Teşekkürler, şu an çalışıyor, dizin adını tam olarak hedefe parametre 1 olarak ilettiğim gibi: "C: \ myprogram.exe" "C: \ thisdir \" Ama bu mümkün değil parametre 1'i "% CD%" gibi bir şey olarak vermek için? - Çok çeşitli varyantları denedim, ancak% CD% 'yi gerçek dir ismi ile değiştiremedim. – Giomach

+0

Bu işe yaramaz. Sabit kod dizini. Bu şekilde tahıllara neden karşı çıkıyorsunuz? Amacın ne? –

cevap

8

Sen STARTF_TITLEISLINKNAME bayrağıyla GetStartupInfo kullanarak da yapabilirsiniz:

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; 

Testi kodu (XE8 ve Delphi 10 Seattle ile Win7 64 üzerinde test - Win8 üzerinde test veya 10 değil):

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. 

Test uygulamasını ('Kısayoldan çalışmayan' gösterecek) test uygulamasını çalıştırarak ve ardından test uygulamasına bir kısayol oluşturup bu kısayolu yürüterek test edebilirsiniz (daha sonra 'Kısayol:' ifadesini ve bunun adını gösterir. lnk dosyası).

+0

Bu özelliği hiç duymadım. Uygulamanın Geçerli Çalışma Dizini kısayol ayarı yerine, bu ne zaman yararlı olur? Bir kısayol etrafında hareket ettirilebilir, bu yüzden neden CWD'ye güvenmek istemezsiniz? Uygulama kısayol yerine kodda başlatılmışsa ne olur? Veya açık bir "Başlangıç" yoluna sahip bir kısayol aracılığıyla başlatıldı mı? Hangi yolu kullanacağınızı bilmek biraz daha karmaşıklaşıyor. "STARTF_TITLEISLINKNAME" kullanılıyorsa, kısayolu yüklemek ve "GetWorkingDirectory()" yöntemini kontrol etmek için "IShellLink" 'i kullanabileceğinizi ve eğer ayarlanmamışsa kısayolun yoluna geri dönebileceğinizi tahmin ediyorum. –

+0

@Remy: Bağlantılı MSDN sayfasında belgelenmiştir. Uygulamanın, başlangıç ​​bilgisini sorgulayarak bir kısayoldan başlatılıp başlatılmadığını belirlemesine izin verir. Kendim için hiç bir zaman kullanmadım, ancak MS bunu uygun hale getiriyor. Bir süredir belgelenmemişti, ancak David şu an silinen bir yorumda bulundu. –

+0

evet, belgeleri okudum. Bugün bu bayrağı hiç duymamış olduğumu (bu günlerde elle GetStartupInfo() işlevini kim kullandığını) söylüyordum. Ama gerçekten, link dosyasının kendisine giden yolu kullanmak hiç işe yaramıyor mu? Elbette, Microsoft bunu mümkün kılıyor, ancak diğer çözümler mevcut olduğunda bunu kimin kullanması gerekiyor? Sadece söylüyorum. Daha fazla yorum yapmaya gerek yok. –