아래 소스는 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;
폴더를 클릭했을때 나오게 하실려면 레지스트리의 폴더키에 등록만 시켜주시면 됩니다. 특정파일을 클릭했을때 나오게 하는것두 레지스트리의 특정파일 키에 등록시켜주시면 되구요...
예제에 보시면 TContextMenuFactory.UpdateRegistry메소드 있을겁니다. 이부분이 레지스트리에 쉘익스텐션을 등록하는 부분이거든요. 여기에 추가 시켜주세요...
// 등록
CreateRegKey('FolderShellExContextMenuHandlersHandel', '',
GUIDToString(Class_ContextMenu ) );
// 제거
DeleteRegKey('FolderShellExContextMenuHandlersHaldel');
^^ 항상 즐코하세요...