none
クライアントドライブ名の取得方法について RRS feed

  • 質問

  • お世話になっております。

    リモートディスクトップ接続の際、ローカルマシン(MyPC)のリソース(Cドライブ,Dドライブ等)を使用できるようにすると

    リモートマシンのエクスプローラーの「その他(2)」に「{ローカルマシンの名前}の{ドライブ名}」が追加されます。

    たとえば、「MyPCのC」とか「MyPCのD」とか。

    ところが、この「{ローカルマシンの名前}の{ドライブ名}」の取得方法がわかりません。

    リソースのリモート名は、WNetOpenEnum→WNetEnumResource→WNetCloseEnumで

    \\tsclient\C

    \\tsclient\D

    と取得できるのですが、このUNCパスでSHGetFileInfo関数を呼び出すと

    タイプ名は

    「共有」で、

    表示名は

    d (\\Tsclient)
    c (\\Tsclient)

    となりました。

    Shell32::IShellDispatchPtr pShell;

    pShell.CreateInstance("Shell.Application");

    pShell->NameSpace(UNCパス)->GetTitle();

    も同じ結果になりました。

    どなたかご存知のかたがいらっしゃいましたら教えてください。

    2012年4月4日 9:04

回答

  • いつもお世話になっております。

    自己レスですが、IShellFolder->GetDisplayNameOf で取得できることが

    わかりました。

    ありがとうございました。

    

    サンプルソース

    	TCHAR         szDisplayName[256];
    	STRRET        strret;
    	PITEMID_CHILD pidlChild;
    	PITEMID_CHILD pidlDrives;
    	IShellFolder  *pDesktopFolder;
    	IShellFolder  *pMyComputer;
    	IEnumIDList   *pEnumIdList;
    
    	CoInitialize(NULL);
    	
    	SHGetDesktopFolder(&pDesktopFolder);
    	SHGetFolderLocation(NULL, CSIDL_DRIVES, NULL, 0, &pidlDrives);
    	pDesktopFolder->BindToObject(pidlDrives, NULL, IID_IShellFolder, (void **)&pMyComputer);
    	if (pMyComputer->EnumObjects(NULL, SHCONTF_FOLDERS, &pEnumIdList) != S_OK) {
    		pMyComputer->Release();
    		pDesktopFolder->Release();
    		return 0;
    	}
    
    	while (pEnumIdList->Next(1, &pidlChild, NULL) == S_OK) {
    		pMyComputer->GetDisplayNameOf(pidlChild, SHGDN_NORMAL, &strret);
    		StrRetToBuf(&strret, pidlChild, szDisplayName, sizeof(szDisplayName) / sizeof(TCHAR));
    		printf("%s\n", szDisplayName);
    		CoTaskMemFree(pidlChild);
    	}
    
    	pEnumIdList->Release();
    	pMyComputer->Release();
    	pDesktopFolder->Release();
    	
    	CoUninitialize();
    


    2012年4月6日 9:14