IExtractImage "Unspecified Error"
0 отговора
49 прегледа
IExtractImage "Unspecified Error"
Използвам следния код, намерен в интернет, за да генерирам тъмбнейли на разни файлове чрез интерфейса IExtractImage. Кода работи добре под windows XP, но под уиндоус 2000 хич го няма - дава ми грешка "Unspecified Error" след извикване на метода GetLocation на IExtractImage. Tърсих безуспешно в интернет - кодът навсякъде е този и никой не е имал моят проблем. Някой да има идеи? Интересното е, че windows explorer на windows 2000 успява да генерира тъмбнейлите без грешка :)
Ето го и кода:
#define TEMP_DIRECTORY L"C:\\TEMP"
#define TEMP_URL L"TEST.URL"
#define TEMP_SHORTCUT TEMP_DIRECTORY L"\\" L"TEST.URL"
#define SHORTCUT_TEMPLATE L"[InternetShortcut]\nURL=%s\n"
BOOL CreateURLShortcut(LPWSTR pszURL, LPWSTR pszShortcutFile) {
WCHAR pszShortcutContents[1024];
HANDLE hf = CreateFileW(pszShortcutFile, GENERIC_READ | GENERIC_WRITE, (DWORD) 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
if(hf == INVALID_HANDLE_VALUE) return FALSE;
int iCharCount = swprintf(pszShortcutContents, SHORTCUT_TEMPLATE, pszURL) + 1;
DWORD dwWritten = 0;
if(!WriteFile(hf, pszShortcutContents, sizeof(WCHAR)*iCharCount, &dwWritten, NULL)) return FALSE;
CloseHandle(hf);
return TRUE;
}
extern "C" __declspec(dllexport) HRESULT CreateThumbnail(LPWSTR pszURL, DWORD dwWidth, DWORD dwHeight, HBITMAP* pThumbnail) {
LPITEMIDLIST pidlItems = NULL, pidlURL = NULL, pidlWorkDir = NULL;
HRESULT hr;
WCHAR pszPath[MAX_PATH];
DWORD dwPriority = 0, dwFlags = IEIFLAG_ORIGSIZE;
SIZE size = { dwWidth, dwHeight };
IExtractImage* peiURL = NULL;
IShellFolder* psfDesktop = NULL;
IShellFolder* psfWorkDir = NULL;
// initialize
CoInitialize( NULL );
hr = SHGetMalloc(&pMalloc);
if(FAILED(hr)) goto OnExit;
hr = SHGetDesktopFolder(&psfDesktop);
if(FAILED(hr)) goto OnExit;
// create shortcut
if(!CreateURLShortcut(pszURL, TEMP_SHORTCUT)) goto OnExit;
// get working directory
hr = psfDesktop->ParseDisplayName(NULL, NULL, TEMP_DIRECTORY, NULL, &pidlWorkDir, NULL);
if(FAILED(hr)) goto OnExit;
hr = psfDesktop->BindToObject(pidlWorkDir, NULL, IID_IShellFolder, (LPVOID*)&psfWorkDir);
if(FAILED(hr)) goto OnExit;
psfDesktop->Release();
psfDesktop = NULL;
pMalloc->Free(pidlWorkDir);
pidlWorkDir = NULL;
// retrieve link information
hr = psfWorkDir->ParseDisplayName(NULL, NULL, TEMP_URL, NULL, &pidlURL, NULL);
if(FAILED(hr)) goto OnExit;
// query IExtractImage
hr = psfWorkDir->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*)&pidlURL, IID_IExtractImage, NULL, (LPVOID*)&peiURL);
if(FAILED(hr)) goto OnExit;
ей тук гърми
hr = peiURL->GetLocation(pszPath, MAX_PATH, &dwPriority, &size, 16, &dwFlags);
if(FAILED(hr)) goto OnExit;
// generate thumbnail
hr = peiURL->Extract(pThumbnail);
if(FAILED(hr)) goto OnExit;
// clean-up IExtractImage
peiURL->Release();
peiURL = NULL;
OnExit:
// free allocated structures
if(peiURL != NULL) peiURL->Release();
if(pidlURL != NULL) pMalloc->Free(pidlURL);
if(pidlWorkDir != NULL) pMalloc->Free(pidlWorkDir);
if(psfDesktop != NULL) psfDesktop->Release();
if(psfWorkDir != NULL) psfWorkDir->Release();
return hr;
}
Ето го и кода:
#define TEMP_DIRECTORY L"C:\\TEMP"
#define TEMP_URL L"TEST.URL"
#define TEMP_SHORTCUT TEMP_DIRECTORY L"\\" L"TEST.URL"
#define SHORTCUT_TEMPLATE L"[InternetShortcut]\nURL=%s\n"
BOOL CreateURLShortcut(LPWSTR pszURL, LPWSTR pszShortcutFile) {
WCHAR pszShortcutContents[1024];
HANDLE hf = CreateFileW(pszShortcutFile, GENERIC_READ | GENERIC_WRITE, (DWORD) 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
if(hf == INVALID_HANDLE_VALUE) return FALSE;
int iCharCount = swprintf(pszShortcutContents, SHORTCUT_TEMPLATE, pszURL) + 1;
DWORD dwWritten = 0;
if(!WriteFile(hf, pszShortcutContents, sizeof(WCHAR)*iCharCount, &dwWritten, NULL)) return FALSE;
CloseHandle(hf);
return TRUE;
}
extern "C" __declspec(dllexport) HRESULT CreateThumbnail(LPWSTR pszURL, DWORD dwWidth, DWORD dwHeight, HBITMAP* pThumbnail) {
LPITEMIDLIST pidlItems = NULL, pidlURL = NULL, pidlWorkDir = NULL;
HRESULT hr;
WCHAR pszPath[MAX_PATH];
DWORD dwPriority = 0, dwFlags = IEIFLAG_ORIGSIZE;
SIZE size = { dwWidth, dwHeight };
IExtractImage* peiURL = NULL;
IShellFolder* psfDesktop = NULL;
IShellFolder* psfWorkDir = NULL;
// initialize
CoInitialize( NULL );
hr = SHGetMalloc(&pMalloc);
if(FAILED(hr)) goto OnExit;
hr = SHGetDesktopFolder(&psfDesktop);
if(FAILED(hr)) goto OnExit;
// create shortcut
if(!CreateURLShortcut(pszURL, TEMP_SHORTCUT)) goto OnExit;
// get working directory
hr = psfDesktop->ParseDisplayName(NULL, NULL, TEMP_DIRECTORY, NULL, &pidlWorkDir, NULL);
if(FAILED(hr)) goto OnExit;
hr = psfDesktop->BindToObject(pidlWorkDir, NULL, IID_IShellFolder, (LPVOID*)&psfWorkDir);
if(FAILED(hr)) goto OnExit;
psfDesktop->Release();
psfDesktop = NULL;
pMalloc->Free(pidlWorkDir);
pidlWorkDir = NULL;
// retrieve link information
hr = psfWorkDir->ParseDisplayName(NULL, NULL, TEMP_URL, NULL, &pidlURL, NULL);
if(FAILED(hr)) goto OnExit;
// query IExtractImage
hr = psfWorkDir->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*)&pidlURL, IID_IExtractImage, NULL, (LPVOID*)&peiURL);
if(FAILED(hr)) goto OnExit;
ей тук гърми
hr = peiURL->GetLocation(pszPath, MAX_PATH, &dwPriority, &size, 16, &dwFlags);
if(FAILED(hr)) goto OnExit;
// generate thumbnail
hr = peiURL->Extract(pThumbnail);
if(FAILED(hr)) goto OnExit;
// clean-up IExtractImage
peiURL->Release();
peiURL = NULL;
OnExit:
// free allocated structures
if(peiURL != NULL) peiURL->Release();
if(pidlURL != NULL) pMalloc->Free(pidlURL);
if(pidlWorkDir != NULL) pMalloc->Free(pidlWorkDir);
if(psfDesktop != NULL) psfDesktop->Release();
if(psfWorkDir != NULL) psfWorkDir->Release();
return hr;
}