Q&A

  • ContextMenu에서 폴더클릭에 대하여....
아래 소스는 ContextMenu에서의 파일이름을 추출하는 부분입니다...
ContextMenu를 등록한후에 파일을 클릭했을때 제가 등록한 메뉴가 나오는것인데
문제는 파일을 클릭했을때에만 나오는것입니다.
폴더를 클릭했을때에도 나오게 하고 싶거든여...

항상 질문만하는거 같네요... ^^

(예제 소스는 한델강의실에 있는 zCtxMenu 입니다. 전체소스도 첨부합니다)

function TContextMenu.IShellExtInit_Initialize(pidlFolder: PItemIDList;
lpdobj: IDataObject; hKeyProgID: HKEY): HResult;
var
Buffer: array[0..MAX_PATH - 1] of Char;
Count: Integer;
FormatEtc: TFormatEtc;
StdMedium: TStgMedium;
begin
Result := E_FAIL;

// 이 초기화 부분에서 데이타(파일 객체)를 알아내서 저장해야 한다. 이 후에는
// IDataObject 인터페이스 객체를 억세스 할 수 없다.
if Assigned(lpdobj) then
begin

   // CF_HDROP포멧에 관한 것은 MSDN을 참조하세요.
   with FormatEtc do
   begin
     cfFormat := CF_HDROP;
     ptd := nil;
     dwAspect := DVASPECT_CONTENT;
     lindex := -1;
     tymed:= TYMED_HGLOBAL;
   end;

   // 아래와 같이 해도 동일함. 아래의 경우는 예외(EOleSysError)를 발생시킴.
   // OleCheck(lpdobj.GetData(FormatEtc, StdMedium));
   if Failed(lpdobj.GetData(FormatEtc, StdMedium)) then
     Exit;

   try
     Count := DragQueryFile(StdMedium.hGlobal, $FFFFFFFF, Buffer, MAX_PATH);

     // 파일 이름을 추출한다.
     if Count = 1 then
     begin
       DragQueryFile(StdMedium.hGlobal, 0, Buffer, MAX_PATH);
       FFileName := Buffer;
     end
     else
       FFileName := PChar('');

     Result := S_OK;

   finally
     ReleaseStgMedium(StdMedium);
   end;

end

else
   Result := E_INVALIDARG;
end;
2  COMMENTS
  • Profile
    최용일 2003.06.25 02:16
    안녕하세요. 최용일입니다.

    폴더를 클릭했을때 나오게 하실려면 레지스트리의 폴더키에 등록만 시켜주시면 됩니다. 특정파일을 클릭했을때 나오게 하는것두 레지스트리의 특정파일 키에 등록시켜주시면 되구요...

    예제에 보시면 TContextMenuFactory.UpdateRegistry메소드 있을겁니다. 이부분이 레지스트리에 쉘익스텐션을 등록하는 부분이거든요. 여기에 추가 시켜주세요...

    // 등록
        CreateRegKey('FolderShellExContextMenuHandlersHandel', '',
          GUIDToString(Class_ContextMenu ) );

    // 제거
        DeleteRegKey('FolderShellExContextMenuHandlersHaldel');

    ^^ 항상 즐코하세요...

  • Profile
    차가운바람 2003.06.25 07:02