Q&A

  • 윈도우 API
shell을 공부하면서 프로그램을 짜고 있습니다.



namespace extension이라는걸 해보려고 하는데 제가 만든 TEST 프로그램을 탐색기 안으로 등록시키는데에는 성공했습니다. 그래서 탐색기를 열면 왼쪽 트리에 c, d, 네트워크 환경, 전화접속네트워크, TEST, 내 서류가방 ...뭐 이런 식으로 상위 트리들이 보여집니다.

그리고 제 TEST를 선택했을 때 오른쪽의 fileview를 제어하면 되는데 문제가 하나 생겼습니다. TEST라는 노드 아래에 서브노드를 그리고 싶은데 탐색기의 트리가 systreeivew32라는 class인데 우리는 ttreeview뭐 이런식이고 다른 점이 한두가지가 아닙니다. 그런데도 어떻게 서브노드를 그릴 수 있는 방법이 없을까요?

3  COMMENTS
  • Profile
    최용일 2000.03.07 22:17
    탐색기(explorer)의 트리뷰는 전적으로 탐색기가 관리합니다. 우리가 신경쓸 부분이

    아니죠. 일단은 탐색기에 등록을 시켰다니 IShellFolder인터페이스를 구현했다고

    생각합니다. IShellFolder의 메소드를 보면 BindToObject란 메소드가 있습니다.

    이 메소드에서 전달받은 PIDL에 근거해서 새로운 폴더 객체를 생성하면 새로 생성된

    폴더객체를 볼 수 있을것입니다...

    Namespace Extension은 제대로된 델파이 예제도 없는데 이 정도까지 구현했다니

    참 대단하다고 생각됩니다. ^^ 열심히 공부하세요...



    이은주 wrote:

    > shell을 공부하면서 프로그램을 짜고 있습니다.

    >

    > namespace extension이라는걸 해보려고 하는데 제가 만든 TEST 프로그램을 탐색기 안으로 등록시키는데에는 성공했습니다. 그래서 탐색기를 열면 왼쪽 트리에 c, d, 네트워크 환경, 전화접속네트워크, TEST, 내 서류가방 ...뭐 이런 식으로 상위 트리들이 보여집니다.

    > 그리고 제 TEST를 선택했을 때 오른쪽의 fileview를 제어하면 되는데 문제가 하나 생겼습니다. TEST라는 노드 아래에 서브노드를 그리고 싶은데 탐색기의 트리가 systreeivew32라는 class인데 우리는 ttreeview뭐 이런식이고 다른 점이 한두가지가 아닙니다. 그런데도 어떻게 서브노드를 그릴 수 있는 방법이 없을까요?

  • Profile
    이은주 2000.03.07 22:59
    먼저 답변에 너무 감사드려요. 사실 어떻게 해야 하나 막막하던 때라.. 끝날 날짜는 다가오고 그렇네요..

    제가 해본 것은

    SHGetDesktopFolder(ShellFolder);

    로 해서 ishellfolder를 얻어오고

    ShellFolder.EnumObjects(hwndOwner, SHCONTF_FOLDERS, EnumIDList);

    를 통해서 각 트리의 이름을 얻어오는 것 까지는 했거든요.

    그런데



    function BindToObject(pidl: PItemIDList; pbcReserved: Pointer;

    const riid: TIID; out ppvOut: Pointer): HResult; stdcall;

    function BindToStorage(pidl: PItemIDList; pbcReserved: Pointer;

    const riid: TIID; out ppvObj: Pointer): HResult; stdcall;



    의 파라미터를 무엇을 넣어야 하는지 정확치가 않아요.



    pidl은 sub folder의 정보를 넣어서 넘겨야 하겠지요?



    riid는 GUID를 적으면될 것 같은데 pcbReserverd는 pointer로 무슨 값을 넣어



    야 하는지 모르겠어요. out으로 넘어오는 ppvOut도 마찬가지이구요.



    설명을 좀 부탁드릴께요.



    최용일 wrote:

    > 탐색기(explorer)의 트리뷰는 전적으로 탐색기가 관리합니다. 우리가 신경쓸 부분이

    > 아니죠. 일단은 탐색기에 등록을 시켰다니 IShellFolder인터페이스를 구현했다고

    > 생각합니다. IShellFolder의 메소드를 보면 BindToObject란 메소드가 있습니다.

    > 이 메소드에서 전달받은 PIDL에 근거해서 새로운 폴더 객체를 생성하면 새로 생성된

    > 폴더객체를 볼 수 있을것입니다...

    > Namespace Extension은 제대로된 델파이 예제도 없는데 이 정도까지 구현했다니

    > 참 대단하다고 생각됩니다. ^^ 열심히 공부하세요...

    >

    > 이은주 wrote:

    > > shell을 공부하면서 프로그램을 짜고 있습니다.

    > >

    > > namespace extension이라는걸 해보려고 하는데 제가 만든 TEST 프로그램을 탐색기 안으로 등록시키는데에는 성공했습니다. 그래서 탐색기를 열면 왼쪽 트리에 c, d, 네트워크 환경, 전화접속네트워크, TEST, 내 서류가방 ...뭐 이런 식으로 상위 트리들이 보여집니다.

    > > 그리고 제 TEST를 선택했을 때 오른쪽의 fileview를 제어하면 되는데 문제가 하나 생겼습니다. TEST라는 노드 아래에 서브노드를 그리고 싶은데 탐색기의 트리가 systreeivew32라는 class인데 우리는 ttreeview뭐 이런식이고 다른 점이 한두가지가 아닙니다. 그런데도 어떻게 서브노드를 그릴 수 있는 방법이 없을까요?

  • Profile
    최용일 2000.03.07 23:43
    흠... 이해가 안가는데요... Namespace extension은 Shell extension과 달리 반드시

    IShellFolder, IPersistFolder, IShellView를 구현해 주어야야하는데

    SHGetDesktopFolder를 이용해서 IShellFolder를 얻는다는 것은 말이 안돼는군요...

    위에서 얻은 IShellFoler는 이은주님의 IShellFolder가 아니라 탐색기의 IShellFolder

    객체입니다. 그러므로 여기에서 EnumObjects를 이용해서 트리를 얻는다 해도 그건

    어디까지나 탐색기의 것이고 여기에 이은주님의 서브트리는 넣을 수 업죠...

    그리고 IShellFolder의 메소드들을 이은주님이 구현하더라도 일단 등록되면 그것이

    필요하다고 생각되면 탐색기가 알아서 호출합니다. 그러한 메소드들의 호출을 탐색기

    가 알아서 해주므로 신경쓸 필요는 없고 다만 그것을 정확하게 구현해주어야 하죠..

    인자는 탐색기가 알아서 넣어줍니다..