我在注册表里添加了一个KEY(功能是把我的程序可以在鼠标右键菜单显示):   
  *\\shell\\Scomber\\Command   
  默认值为:   
  "D:\mytest.exe"   %1
现在我在一个目录下面选中三个文件,我点右键选择我的程序,但是这个时候总是只能获得第一个程序,如何把三个程序都获得阿。
我用的是ParamCount和ParamStr

解决方案 »

  1.   

    http://www.codeproject.com/shell/ShellExtGuide2.asp
      

  2.   

    这个问题应该要用Shell编程来实现。。不知道具体怎么做。帮你顶。。一起学习。。
      

  3.   

    默认值为:   
      "D:\mytest.exe"   %1
    你定义就此1个参数,后面的当然传不了了。
      

  4.   

    看看这两个帖子都包含你要的内容http://www.yesky.com/20000701/89833.shtmlhttp://www.wangwa.com/info/2006-12/46570.htm
      

  5.   

    unit ContextMenuHandle;
    interface
       uses Windows,ActiveX,ComObj,ShlObj,Classes;
    type
       TContextMenu = class(TComObject,IShellExtInit,IContextMenu)
       private
          FFileName: array[0..MAX_PATH] of Char;
       protected
          function IShellExtInit.Initialize = SEIInitialize; // Avoid compiler warning
          function SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
                   hKeyProgID: HKEY): HResult; stdcall;
          function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast,
                   uFlags: UINT): HResult; stdcall;
          function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
          function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
                   pszName: LPSTR; cchMax: UINT): HResult; stdcall;
    end;
    const   Class_ContextMenu: TGUID = '{19741013-C829-11D1-8233-0020AF3E97A0}';
    {全局唯一标识符(GUID)是一个16字节(128为)的值,它唯一地标识一个接口(interface)}
    var
       FileList:TStringList;
    implementation
    uses ComServ, SysUtils, ShellApi, Registry,UnitForm;
    function TContextMenu.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
       hKeyProgID: HKEY): HResult;
    var
       StgMedium: TStgMedium;
       FormatEtc: TFormatEtc;
       FileNumber,i:Integer;
    begin
       http://www.xfbbs.com/Book/others/_25C8_25E7/default.htm果lpdobj等于Nil,则本调用失败
       if (lpdobj = nil) then begin
          Result := E_INVALIDARG;
          Exit;
       end;
       FileList:=TStringList.Create;
       FileList.Clear;
       http://www.xfbbs.com/Book/others/_25B3_25F5/default.htm始化剪贴版格式文件
       with FormatEtc do begin
          cfFormat := CF_HDROP;
          ptd := nil;
          dwAspect := DVASPECT_CONTENT;
          lindex := -1;
          tymed := TYMED_HGLOBAL;
       end;
       Result := lpdobj.GetData(FormatEtc, StgMedium);   if Failed(Result) then Exit;
       FileNumber := DragQueryFile(StgMedium.hGlobal,$FFFFFFFF,nil,0);
       for i:=0 to FileNumber-1 do begin
          DragQueryFile(StgMedium.hGlobal, i, FFileName, SizeOf(FFileName));
          FileList.Add(FFileName);
          Result := NOERROR;
       end;   ReleaseStgMedium(StgMedium);
    end;function TContextMenu.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
       idCmdLast, uFlags: UINT): HResult;
    begin
      Result := 0;
      if ((uFlags and $0000000F) = CMF_NORMAL) or
         ((uFlags and CMF_EXPLORE) <> 0) then begin
        // 往Context Menu中加入一个菜单项 ,菜单项的标题为察看位图文件
        InsertMenu(Menu, indexMenu, MF_STRING or MF_BYPOSITION, idCmdFirst,
            PChar('文件操作'));
        // 返回增加菜单项的个数
        Result := 1;
      end;
    end;function TContextMenu.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
    var
      frmOP:TForm1;
    begin
      // 首先确定该过程是被系统而不是被一个程序所调用
      if (HiWord(Integer(lpici.lpVerb)) <> 0) then
      begin
         Result := E_FAIL;
         Exit;
      end;
      // 确定传递的参数的有效性
      if (LoWord(lpici.lpVerb) <> 0) then begin
         Result := E_INVALIDARG;
         Exit;
      end;   //文件操作窗口
      frmOP:=TForm1.Create(nil);
      http://www.xfbbs.com/Book/others/_25BD_25AB/default.htm所有的文件列表添加到文件操作窗口的列表中
      frmOP.ListBox1.Items := FileList;
      Result := NOERROR;
    end;function TContextMenu.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
             pszName: LPSTR; cchMax: UINT): HRESULT;
    begin
       if (idCmd = 0) then begin
       if (uType = GCS_HELPTEXT) then
          {返回该菜单项的帮助信息,此帮助信息将在用户把鼠标
          移动到该菜单项时出现在状态条上。}
          StrCopy(pszName, PChar('点击该菜单项将执行文件操作'));
          Result := NOERROR;
       end
       else
          Result := E_INVALIDARG;
    end;type
       TContextMenuFactory = class(TComObjectFactory)
       public
       procedure UpdateRegistry(Register: Boolean); override;
    end;procedure TContextMenuFactory.UpdateRegistry(Register: Boolean);
    var
       ClassID: string;
    begin
       if Register then begin
          inherited UpdateRegistry(Register);
          ClassID := GUIDToString(Class_ContextMenu);
          http://www.xfbbs.com/Book/others/_25B5_25B1/default.htm注册扩展库文件时,添加库到注册表中
          CreateRegKey('*\shellex', '', '');
          CreateRegKey('*\shellex\ContextMenuHandlers', '', '');
          CreateRegKey('*\shellex\ContextMenuHandlers\FileOpreation', '', ClassID);
        //果操作系统为Windows NT的话
          if (Win32Platform = VER_PLATFORM_WIN32_NT) then
          with TRegistry.Create do
          try
             RootKey := HKEY_LOCAL_MACHINE;
             OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions', True);
             OpenKey('Approved', True);
             WriteString(ClassID, 'Context Menu Shell Extension');
          finally
             Free;
          end;
       end
       else begin
          DeleteRegKey('*\shellex\ContextMenuHandlers\FileOpreation');
          inherited UpdateRegistry(Register);
       end;
    end;