Q&A

  • 최용일님이 올려주신 강좌보구 질문 드립니다...
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;
1  COMMENTS
  • Profile
    최용일 2002.10.30 04:41
    안녕하세요. 최용일입니다.

    이거 한지 오래되어서 확실히 기억이 안나는데 ...

    파라매터로 들어오는 pidlFolder란 PIDL을 받잖아요. 아마두 이게 패스일겁니다.

    ShlObj유닛에 있는 SHGetPathFromIDList란 함수를 써서 PIDL확인해보세요.

    아니면 멜이나 다시 질문주세요 제대로 찾아보겠습니다.

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