Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

IShellFolder::ParseDisplayName не выполняется для русских символов.

7.9K
13 марта 2006 года
x3dcoder
25 / / 25.12.2005
Подскажите пожалуйста решение:
я использую IShellFolder и IContextMenu для отображения свойств папки или файла. Если путь к папке содержит только английские буквы, то все работает, а когда путь содержит русские символы, то IShellFolder :: ParseDisplayName не выполняется.
Возможно это из-за неверного перевода русских символов в юникод?
В чем тут дело?

Заранее благодарю.
351
13 марта 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by x3dcoder
Подскажите пожалуйста решение:
я использую IShellFolder и IContextMenu для отображения свойств папки или файла. Если путь к папке содержит только английские буквы, то все работает, а когда путь содержит русские символы, то IShellFolder :: ParseDisplayName не выполняется.
Возможно это из-за неверного перевода русских символов в юникод?
В чем тут дело?

Заранее благодарю.



1. Приведи код.
2. Проверь с помощью каких либо файловых менеджеров или у тя вообще отображаются файлы и пути с русскими буквами.

7.9K
14 марта 2006 года
x3dcoder
25 / / 25.12.2005
Вот код:

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 в однобайтовой кодировке.
7.9K
14 марта 2006 года
x3dcoder
25 / / 25.12.2005
В проге используется MFC/ATL каркас. Может я что-то недонастроил?
351
14 марта 2006 года
PitxBull
633 / / 22.12.2004
у меня твой код тоже не работает. причина в том что ты получаешь ansi-строку а работаешь с ней как multi-byte( шо воно таке ? :)))) :D ).

все работает если заменить код
 
Код:
// convert filename to wide string
memset(fwname, L'\0', (MAX_PATH+1)*sizeof(WCHAR));
mbstowcs(fwname, filename, MAX_PATH);
fwname[MAX_PATH]=L'\0';


на код

 
Код:
USES_CONVERSION;
memcpy(fwname, A2W(filename), MAX_PATH );
351
14 марта 2006 года
PitxBull
633 / / 22.12.2004
кстати более простой вариант той же функции
Код:
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 );

здесь CurrentPIDL - путь для которого надо показать диалог с пропертями... но его можно заменить на обычный путь в файловой системе ("c:\\....") посмотри справку к функции ShellExecuteEx
7.9K
14 марта 2006 года
x3dcoder
25 / / 25.12.2005
Спасибо за помощь. :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог