包括拷貝、洗掉PIDL對應的檔案,或訪問其內容。
注意,是直接通過PIDL訪問,而不是先把它轉換為檔案名去訪問。
具體例子是,比如通過USB/MTP協議連接到PC上的,可以得到其PIDL,但是不能用SHGetPathFromIDList轉化為檔案名。這種物件如何通過PIDL去訪問呢?
uj5u.com熱心網友回復:
自己封裝下?假裝是直接訪問
uj5u.com熱心網友回復:
訪問這些設備一樣需要用 CreateFile 并傳入特定格式的字串,至少微軟并沒有開放直接使用 PIDL 讀取非檔案,如通訊埠等資料。CreateFile 的路徑可以傳入這些格式的字串:本機檔案:
x:\path\file.ext
\\?\x:\path\file.ext
共享檔案:
\\server\share\path\file.ext
\\?\UNC\server\share\path\file.ext
通訊埠:(X為十進制數序號)
COMX
LTPX
\\?\LTPX
\\?\COMX
磁盤:(X為十進制數序號)
\\.\CdRomX
\\.\PhysicalDiskX
\\.\Device\HarddiskVolumeX
以上是絕大多數,但我并不能保證齊全。另外,上面字串是指引數的實際內容,在 C、Java 中,明文字串中的反斜線需要轉義,即寫成兩個。
uj5u.com熱心網友回復:
從應用程式,還是需要通過PIDL轉換為路徑,然后用CreateFile等API去訪問uj5u.com熱心網友回復:
void CMyExploreView::PopulateList(LPTVITEMDATA lptvid)
{//from lptvid->lpsfparent->current_folder
LPSHELLFOLDER lpsf2=NULL;
HRESULT hr;
// Initialize the list view to be empty.
CListCtrl &RightList=GetListCtrl();
RightList.DeleteAllItems();
// ask for current folder
if (lptvid)
{
hr=lptvid->lpsfParent->BindToObject(lptvid->lpi,
0, IID_IShellFolder,(LPVOID *)&lpsf2);
if (SUCCEEDED(hr))
{// current dir oK
FillListView(lpsf2,lptvid->lpifq);//
lpsf2->Release();
// then sorting
RightList.SortItems(ListViewCompareProc,0);// name
}
}
}
hr=lptvid->lpsfParent->BindToObject(lptvid->lpi,
uj5u.com熱心網友回復:
其中typedef struct tagID
{
LPSHELLFOLDER lpsfParent;
LPITEMIDLIST lpi;
LPITEMIDLIST lpifq;
} TVITEMDATA, *LPTVITEMDATA;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/101199.html
