1

私のアプリケーションは、PIDL を文字列として受け取ります。

QString pidl = "::{20D04FE1-3AEA-1069-A2D8-08002B30309B}";

この場合は に対応しMy Computerます。に変換する必要がありMy Computerます。

最初のパラメーターとしてSHGetPathFromIDListを必要とし、それを文字列に変換する WINAPI 関数があります。LPCITEMIDLIST

どうすればそれを構築できLPCITEMIDLISTますか?

アップデート

これは私がこれまでに得たものです:

LPCWSTR csPath = (LPCWSTR)"::{20D04FE1-3AEA-1069-A2D8-08002B30309B}";
LPITEMIDLIST stId = 0;
SFGAOF stSFGAOFIn = 0;
SFGAOF stSFGAOFOut = 0;
if(!FAILED(SHParseDisplayName(csPath, 0, stId, stSFGAOFIn, &stSFGAOFOut)))
    msgBox("not failed")

残念ながら、このコードはクラッシュします。

4

3 に答える 3

2

私はそうかもしれないと思います:

SHParseDisplayName(csPath、0、&stId、stSFGAOFIn、&stSFGAOFOut)

MSDNからのSHParseDisplayNameの宣言:

HRESULT SHParseDisplayName(
  __in       LPCWSTR pszName,
  __in_opt   IBindCtx *pbc,
  __out      PIDLIST_ABSOLUTE *ppidl,
  __in       SFGAOF sfgaoIn,
  __out_opt  SFGAOF *psfgaoOut
);
于 2012-05-16T17:18:00.980 に答える
2

SHParseDisplayName()の1番目と3番目のパラメータを正しく設定していないため、コードがクラッシュします。代わりにこれを試してください:

LPCWSTR csPath = L"::{20D04FE1-3AEA-1069-A2D8-08002B30309B}"; 
PIDLIST_ABSOLUTE stId = NULL; 
SFGAOF stSFGAOFIn = 0; 
SFGAOF stSFGAOFOut = 0; 
if (!FAILED(SHParseDisplayName(csPath, NULL, &stId, stSFGAOFIn, &stSFGAOFOut))) 
    msgBox("not failed") 
于 2012-05-16T18:18:16.893 に答える
2

SHGetPathFromIDList「マイ コンピュータ」のパスがないため、必要な機能はありません。

QString pidl を に変換するには、PIDLIST_ABSOLUTEを使用する必要がありますSHParseDisplayName

を "My Computer" のようなローカライズされた文字列に変換するにはPIDLIST_ABSOLUTE、 が必要SHGetNameFromIDListです。

于 2012-05-16T11:30:48.940 に答える