SHGetFileInfo не возвращает расположение значка

Я пытаюсь извлечь значок файла и вернуть его в GetIconLocation расширения оболочки.
в общем я меняю иконки файлов (te.docx.xx) с расширением xx и возвращает значок файла без xx. (для этого я создаю временный файл во временном каталоге с исходным расширением, например, te.docx)
моя операционная система Windows 7 x64.
мой код:

    STDMETHODIMP CTxtIconShlExt::GetIconLocation (
UINT uFlags,  LPTSTR szIconFile, UINT cchMax,
int* piIndex, UINT* pwFlags )
{
DWORD     dwFileSizeLo, dwFileSizeHi;
DWORDLONG qwSize;
HANDLE    hFile;
OutputDebugStringW(L"Hello world, from GetIconLocation !");
std::string strFilePath;
std::string tempFolder="c:\\.tmp";
std::string tempFile="tmpfile";
std::string fileWithOutDN;
SHFILEINFO retShFileInfo;
for(int i = 0; m_szFilename[i] != 0; i++)
{
strFilePath += m_szFilename[i];
}

fileWithOutDN= strFilePath.substr(0,strFilePath.size()-3 );
std::string extension = fileWithOutDN.substr(fileWithOutDN.find_last_of("."));
CreateDirectory(tempFolder.c_str(),NULL);

tempFile=tempFolder+"\\"+tempFile+extension;

GetFileAttributes(tempFile.c_str()); // from winbase.h
if(INVALID_FILE_ATTRIBUTES == GetFileAttributes(tempFile.c_str()) && GetLastError()==ERROR_FILE_NOT_FOUND)
{
//File not found
HANDLE h = CreateFile(tempFile.c_str(),    // name of the file
GENERIC_WRITE, // open for writing
0,             // sharing mode, none in this case
0,             // use default security descriptor
CREATE_ALWAYS, // overwrite if exists
FILE_ATTRIBUTE_NORMAL,
0);
if (h)
{
CloseHandle(h);
}else
{
return S_FALSE; //faild to create file
}
}

ZeroMemory(&retShFileInfo, sizeof(SHFILEINFO));
CoInitialize(NULL);
SHGetFileInfo(tempFile.c_str(),256,&retShFileInfo,sizeof(SHFILEINFO),SHGFI_ICON | SHGFI_LARGEICON);
lstrcpyn ( szIconFile, retShFileInfo.szDisplayName, cchMax );
*piIndex = retShFileInfo.iIcon;
*pwFlags = 0;
return S_OK;

Моя проблема заключается в том, что retShFileInfo.szDisplayName возвращает пустой массив (все элементы равны нулю), он должен возвращать полный путь к расположению значка.
Я пытаюсь играть с комбинацией флагов, но ничего не помогло

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]