CreateProcessの処理対象


Campus  2004-12-03 02:38:25  No: 12024

CreateProcessで起動する際、ショートカットプログラムをうまく起動できませんでした。

CreateProcessの対象となるのは、EXEファイルだけなのでしょうか?


にしの  2004-12-03 19:45:03  No: 12025

こちらが参考になるかと。
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_createprocess.htm

これを読む限りでは、.EXEだけとは限りませんね。.COMも実行できますし。
ショートカットを処理したい場合は、IShellLinkインターフェースを使用して実行ファイル、引数、作業ディレクトリなどを取得してからCreateProcessに渡す必要があります。


りおりお  2004-12-03 22:59:26  No: 12026

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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加