CreateProcessで起動する際、ショートカットプログラムをうまく起動できませんでした。
CreateProcessの対象となるのは、EXEファイルだけなのでしょうか?
こちらが参考になるかと。
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_createprocess.htm
これを読む限りでは、.EXEだけとは限りませんね。.COMも実行できますし。
ショートカットを処理したい場合は、IShellLinkインターフェースを使用して実行ファイル、引数、作業ディレクトリなどを取得してからCreateProcessに渡す必要があります。
http://www.informit.com/articles/article.asp?p=26940&seqNum=4
http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=2#0273.txt
上記の内容を参考にして Dephi6 でショートカットファイルから情報を得る
関数を試しました。うまくいくようです。
uses
ActiveX, ShlObj, ComObj;
type
TShellLinkInfo = record
PathName: string;
Arguments: string;
Description: string;
WorkingDirectory: string;
IconLocation: string;
IconIndex: integer;
ShowCmd: integer;
HotKey: word;
end;
procedure GetShellLinkInfo(const LinkFile: WideString; var SLI: TShellLinkInfo);
var
SL: IShellLink;
PF: IPersistFile;
FindData: TWin32FindData;
AStr: array[0..MAX_PATH] of char;
begin
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, SL));
PF := SL as IPersistFile;
OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ));
OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));
with SLI do
begin
OleCheck(SL.GetPath(AStr, MAX_PATH, FindData, SLGP_SHORTPATH));
PathName := AStr;
OleCheck(SL.GetArguments(AStr, MAX_PATH));
Arguments := AStr;
OleCheck(SL.GetDescription(AStr, MAX_PATH));
Description := AStr;
OleCheck(SL.GetWorkingDirectory(AStr, MAX_PATH));
WorkingDirectory := AStr;
OleCheck(SL.GetIconLocation(AStr, MAX_PATH, IconIndex));
IconLocation := AStr;
OleCheck(SL.GetShowCmd(ShowCmd));
OleCheck(SL.GetHotKey(HotKey));
end;
end;
function ShortToLongFileName(const ShortName: string): string;
var
Desktop: IShellFolder;
pIDList: PITEMIDLIST;
NameS: String;
NameW: WideString;
Len : integer;
Buffer: array[0..MAX_PATH] of Char;
pDummy: PCHAR;
pchEaten, Attributes: ULONG;
begin
pIDList := Nil;
Len := GetFullPathName(PChar(ShortName), 0, PChar(result), pDummy);
SetLength(NameS, Len);
GetFullPathName(PChar(ShortName), Len, PChar(NameS), pDummy);
NameW := NameS;
OleCheck(SHGetDesktopFolder(Desktop));
OleCheck(Desktop.ParseDisplayName(0, Nil, PWideChar(NameW), pchEaten, pIDList, Attributes));
if not SHGetPathFromIDList(pIDList, Buffer) then
raise EConvertError.Create('ファイルを変換できません。');
Result := StrPas(Buffer);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
sli:TShellLinkInfo;
begin
GetShellLinkInfo('C:\Adobe Reader 6.0.lnk', sli);
Label1.Caption := sli.PathName;
Label2.Caption := ShortToLongFileName(sli.PathName);
end;
ツイート | ![]() |