// convert filename to wide string
memset(fwname, L'\0', (MAX_PATH+1)*sizeof(WCHAR));
mbstowcs(fwname, filename, MAX_PATH);
fwname[MAX_PATH]=L'\0';
IShellFolder::ParseDisplayName не выполняется для русских символов.
я использую IShellFolder и IContextMenu для отображения свойств папки или файла. Если путь к папке содержит только английские буквы, то все работает, а когда путь содержит русские символы, то IShellFolder :: ParseDisplayName не выполняется.
Возможно это из-за неверного перевода русских символов в юникод?
В чем тут дело?
Заранее благодарю.
Цитата:
Originally posted by x3dcoder
Подскажите пожалуйста решение:
я использую IShellFolder и IContextMenu для отображения свойств папки или файла. Если путь к папке содержит только английские буквы, то все работает, а когда путь содержит русские символы, то IShellFolder :: ParseDisplayName не выполняется.
Возможно это из-за неверного перевода русских символов в юникод?
В чем тут дело?
Заранее благодарю.
Подскажите пожалуйста решение:
я использую IShellFolder и IContextMenu для отображения свойств папки или файла. Если путь к папке содержит только английские буквы, то все работает, а когда путь содержит русские символы, то IShellFolder :: ParseDisplayName не выполняется.
Возможно это из-за неверного перевода русских символов в юникод?
В чем тут дело?
Заранее благодарю.
1. Приведи код.
2. Проверь с помощью каких либо файловых менеджеров или у тя вообще отображаются файлы и пути с русскими буквами.
void DisplayPropertiesDlg(LPCTSTR filename)
{
HRESULT hr;
LPMALLOC pMalloc = NULL;
LPSHELLFOLDER desktop = NULL, pfolder=NULL;
LPCONTEXTMENU mnu = NULL;
LPITEMIDLIST pidl = NULL, pLastId=NULL;
CMINVOKECOMMANDINFO cmd;
WCHAR fwname[MAX_PATH+1];
int i=0;
ULONG attr=SFGAO_FILESYSTEM;
USHORT temp;
// convert filename to wide string
memset(fwname, L'\0', (MAX_PATH+1)*sizeof(WCHAR));
mbstowcs(fwname, filename, MAX_PATH);
fwname[MAX_PATH]=L'\0';
hr = SHGetMalloc(&pMalloc);
if(SUCCEEDED(hr))
__try
{
hr = SHGetDesktopFolder(&desktop);
if(SUCCEEDED(hr))
__try
{
// ЭТА ФУНКЦИЯ НЕ СРАБАТЫВАЕТ ЕСЛИ ПУТЬ filename СОДЕРЖИТ РУССКИЕ БУКВЫ
hr = desktop->ParseDisplayName(m_hWnd, NULL, fwname, NULL, &pidl, &attr);
if(SUCCEEDED(hr))
__try
{
// prepare to bind object
pLastId = pidl;
while(1)
{
int offset = pLastId->mkid.cb;
temp = *(USHORT*)((BYTE*)pLastId + offset);
if(!temp)break;
pLastId = (LPITEMIDLIST)((BYTE*)pLastId + offset);
}
temp = pLastId->mkid.cb;
pLastId->mkid.cb = 0;
// bind object
hr = desktop->BindToObject(pidl, NULL, IID_IShellFolder,
(void**)&pfolder);
// get context menu interface
pLastId->mkid.cb = temp;
hr = pfolder->GetUIObjectOf(m_hWnd, 1,(LPCITEMIDLIST*)(&pLastId),
IID_IContextMenu, NULL, (void**)&mnu);
if(SUCCEEDED(hr))
__try
{
memset(&cmd, 0, sizeof(cmd));
cmd.cbSize = sizeof(cmd);
cmd.fMask = 0;
cmd.hwnd = m_hWnd;
cmd.lpVerb = _T("Properties");
cmd.nShow = SW_SHOWNORMAL;
hr = mnu->InvokeCommand(&cmd);
}
__finally
{
mnu->Release();
}
}
__finally
{
pMalloc->Free(pidl);
}
}
__finally
{
desktop->Release();
}
}
__finally
{
pMalloc->Release();
}
}
Функция void DisplayPropertiesDlg(LPCTSTR filename) должна вызвать диалог свойств папки или файла, имя
которого указывается параметром filename в однобайтовой кодировке.
В проге используется MFC/ATL каркас. Может я что-то недонастроил?
все работает если заменить код
Код:
на код
Код:
USES_CONVERSION;
memcpy(fwname, A2W(filename), MAX_PATH );
memcpy(fwname, A2W(filename), MAX_PATH );
Код:
SHELLEXECUTEINFO shExecInfo;
shExecInfo.cbSize = sizeof( SHELLEXECUTEINFO );
shExecInfo.fMask = SEE_MASK_INVOKEIDLIST;
shExecInfo.hwnd = m_hWnd;
shExecInfo.lpVerb = "properties";
shExecInfo.lpFile = NULL;
shExecInfo.lpParameters = NULL;
shExecInfo.lpDirectory = NULL;
shExecInfo.nShow = SW_SHOWNORMAL;
shExecInfo.hInstApp = 0;
shExecInfo.lpIDList = CurrentPIDL;
shExecInfo.lpClass = NULL;
shExecInfo.hkeyClass = 0;
shExecInfo.dwHotKey = 0;
shExecInfo.hIcon = 0;
shExecInfo.hProcess = 0;
ShellExecuteEx( &shExecInfo );
shExecInfo.cbSize = sizeof( SHELLEXECUTEINFO );
shExecInfo.fMask = SEE_MASK_INVOKEIDLIST;
shExecInfo.hwnd = m_hWnd;
shExecInfo.lpVerb = "properties";
shExecInfo.lpFile = NULL;
shExecInfo.lpParameters = NULL;
shExecInfo.lpDirectory = NULL;
shExecInfo.nShow = SW_SHOWNORMAL;
shExecInfo.hInstApp = 0;
shExecInfo.lpIDList = CurrentPIDL;
shExecInfo.lpClass = NULL;
shExecInfo.hkeyClass = 0;
shExecInfo.dwHotKey = 0;
shExecInfo.hIcon = 0;
shExecInfo.hProcess = 0;
ShellExecuteEx( &shExecInfo );
здесь CurrentPIDL - путь для которого надо показать диалог с пропертями... но его можно заменить на обычный путь в файловой системе ("c:\\....") посмотри справку к функции ShellExecuteEx
Спасибо за помощь. :)