这里是我目前查资料写出来的代码,到最后两个函数之前没问题,返回正确,但最后两个都出错,倒是能编译运行,请问错在哪里??? 
另外后面我要保存获取的图片写到一个bmp文件中,该如何继续呢,用哪些API? 
各位我从未涉足windows shell的东西,C++只知道语法,请知道的朋友指教。 /* lib C/C++ */ 
#include <string.h> 
#include <iostream> /* GESTION DES INTERFACES */ 
/* pour IShellFolder */ 
#include <shobjidl.h> 
/* pour IIDFromString */ 
#include <Objbase.h> 
/* pour IDispatch */ 
#include <Oleauto.h> 
/* pour SHGetDesktopFolder */ 
#include <shlobj.h> 
using namespace std; 
#define CteGUID_IShellFolder L"{000214E6-0000-0000-C000-000000000046}" 
#define CteGUID_IDispatch L"{00020400-0000-0000-C000-000000000046}" 
#define CteGUID_IExtractImage L"{BB2E617C-0920-11D1-9A0B-00C04FC2D6C1}" void convertStringToLPWSTR(char *i_value_to_convert, LPWSTR *o_value) 

int size = (int)strlen(i_value_to_convert) + 1; 
LPWSTR tmp = new wchar_t[size]; 
MultiByteToWideChar(CP_ACP, 0, i_value_to_convert, size, tmp, size); 
*o_value = tmp; 

int main(int argc, char**argv) 

char path[255 + 1]; 
LPWSTR lpwstr_path; char filename[255 + 1]; 
LPWSTR lpwstr_filename; HRESULT hrc = S_OK; IShellFolder *p_desktop = NULL; 
IShellFolder *p_folder = NULL; 
IExtractImage *p_thumbnail = NULL; 
LPITEMIDLIST pidl; IID iid_IShellFolder; /* explorer windows */ 
IID iid_IDispatch; /* pour les QueryInterface / Release */ 
IID iid_IExtractImage; /* pour extraine la miniature de l'explorateur */ hrc = IIDFromString(CteGUID_IShellFolder, &iid_IShellFolder); 
if (SUCCEEDED(hrc)) 

cout < < "IID CteGUID_IShellFolder correctement recupere" < < endl; 

hrc = IIDFromString(CteGUID_IDispatch, &iid_IDispatch); 
if (SUCCEEDED(hrc)) 

cout < < "IID CteGUID_IDispatch correctement recupere" < < endl; 

hrc = IIDFromString(CteGUID_IExtractImage, &iid_IExtractImage); 
if (SUCCEEDED(hrc)) 

cout < < "IID CteGUID_IExtractImage correctement recupere" < < endl; 
} hrc = SHGetDesktopFolder(&p_desktop); 
if (SUCCEEDED(hrc)) 

cout < < "SHGetDesktopFolder OK" < < endl; 
strcpy(path, "C:\\catiman\\catuii\\"); 
convertStringToLPWSTR(path, &lpwstr_path); 
hrc = p_desktop->ParseDisplayName(0, 0, lpwstr_path, 0, &pidl, 0); 
if (SUCCEEDED(hrc)) 

cout < < "ParseDisplayName " < < path < <" OK" < < endl; 

hrc = p_desktop->BindToObject(pidl, 0, iid_IShellFolder, (void**)&p_folder); 
if (SUCCEEDED(hrc)) 

cout < < "BindToObject OK" < < endl; 

strcpy(filename, "Plan.CATPart"); 
convertStringToLPWSTR(filename, &lpwstr_filename); hrc = p_folder->ParseDisplayName(0, 0, lpwstr_filename, 0, &pidl, 0); 
if (SUCCEEDED(hrc)) 

cout < < "ParseDisplayName " < < filename < <" OK" < < endl; 
} /* 
hrc = p_folder->BindToObject(pidl, 0, iid_IExtractImage, (void**)&p_thumbnail); 
if (SUCCEEDED(hrc)) 

cout < < "BindToObject OK" < < endl; 

else{ 
cout < < "BindToObject FAIL" < <endl; 

*/ 
/* 
hrc = p_folder->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*)pidl, IID_IExtractImage, NULL, (LPVOID*)&p_thumbnail); 
if (SUCCEEDED(hrc)) 

cout < < "GetUIObject OK" < < endl; 

else{ 
cout < < "GetUIObject FAIL" < < endl; 

*/ } 
else { 
cout < < "impossible create instance of IShellFolder" < < endl; 

cout < < "end process" < < endl; 
getchar(); 
return 0;