WinZip처럼 탐색기에 팝업메뉴 만들기. 라는 강좌봤는데여...
아래함수부분에서 파일명을(FFilename)가져오는것은 되는데여...
그 파일의 풀패스를 가져오려면 어떻게 해야되져?
좋은 하루들 되세요...
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;
// 이부분에 파일의 풀패스도 FDirName라는 변수에 저장하고 싶거든여.. <=======여깁니다..
end
else
FFileName := PChar('');
Result := S_OK;
finally
ReleaseStgMedium(StdMedium);
end;
end
else
Result := E_INVALIDARG;
end;
이거 한지 오래되어서 확실히 기억이 안나는데 ...
파라매터로 들어오는 pidlFolder란 PIDL을 받잖아요. 아마두 이게 패스일겁니다.
ShlObj유닛에 있는 SHGetPathFromIDList란 함수를 써서 PIDL확인해보세요.
아니면 멜이나 다시 질문주세요 제대로 찾아보겠습니다.
^^ 항상 즐코하세요...