察看一下itemidlist这个结构体,她的定义如下:
  typedef struct _ITEMIDLIST {
    SHITEMID mkid;
      } ITEMIDLIST;
其中的shitemid又是另外一个结构体:
typedef struct _SHITEMID { 
    USHORT cb; 
    BYTE   abID[1]; 
    } SHITEMID, * LPSHITEMID;
_SHITEMID 利用了struct的Unsized Arrays。使得abid可以相当于指向一个字符串。但是我就想不通为什么_ITEMIDLIST 经过系统后,可以相当于一个list(This structure is an ordered sequence of one or more item IDs, terminated by a two-byte NULL),我想知道的是:本来只是含有一个SHITEMID的他,是如何变成含有许多个SHITEMID的,是如何实现的???

解决方案 »

  1.   

    void Concatenate(LPCITEMIDLIST pidl2)
       {
          if( (m_pidl == NULL) && (pidl2 == NULL) ) return;
          if( m_pidl == NULL ) {
             m_pidl = PidlCopy(pidl2);
             return;
          }
          if( pidl2 == NULL ) return;
          DWORD cb1, cb2;
          cb1 = GetByteSize() - sizeof(USHORT);
          cb2 = PidlGetByteSize(pidl2);
          LPITEMIDLIST pidlNew = (LPITEMIDLIST) _Module.m_Allocator.Alloc(cb1 + cb2);
          if( pidlNew != NULL ) {
             ::CopyMemory(pidlNew, m_pidl, cb1);
             ::CopyMemory( ((LPBYTE)pidlNew) + cb1, pidl2, cb2 );
          }
          Attach(pidlNew);
       }