최용일님의 답변으로 파일과 폴더 클릭시는 처리를 했습니다...
그런데 이번엔 ㅜㅜ 복수개의 파일이나 폴더를 클릭했을때가
문제입니다... FFileName 값이 아무것도 안들어와서리 ㅜㅜ
그리고 다수 선택된 파일이나 폴더가 섞여있을경우
파일인지 폴더인지 어떻게 알수가 있나요...
읽어주셔서 감사합니다...
(예제 소스는 한델강의실에 있는 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;
저기 강좌 읽어보시면 단 하나만 선택했을때 뜨도록 코딩되어 있다고 되어 있을텐데요... 쩝~~~
코딩 좀만 살펴보시면 복수개의 파일을 다루는것도 금방하실텐데 아쉽네요...
DragQueryFile의 두번째 인자에 $FFFFFFFF을 넣으면 선택된 갯수를 구할 수 있습니다. 예제에 있는 아래코드가 그것이죠...
Count := DragQueryFile(StdMedium.hGlobal, $FFFFFFFF, Buffer, MAX_PATH);
예제에는 if Count = 1 then ... 이런식으로 되어있어서 단 하나만 선택되었을때의 처리를 합니다. 여러개를 처리할려면 Count만큼 루프를 돌리시면 되지 않나요?
for Index := 0 to Count - 1 do
begin
DragQueryFile(StdMedium.hGlobal, Index, Buffer, MAX_PATH);
FFileName := Buffer;
파일이름을 컨택스트메뉴띄울때(QueryContextMenu)나 컨택스트메뉴를 실행할때(InvokeCommand) 사용하기 위해서 배열이나 리스트에 저장한다.
end;
DirectoryExists, FileExists를 이용하시면 디렉토리인지 아실 수 있겠네요...
FindFirst/FindClose함수를 이용하셔도 아실 수 있구요...
GetFileAttributes(Ex)란 APi함수를 이용하셔도 되구요...
^^ 항상 즐코하세요...