高手帮忙!windows shell接口编程,关于BindToObject和IExtractImage.

acneyouth 2004-04-30 11:42:16
这个程序的目的是要得到一个文件的IExtractImage接口,然后
取得它的缩略图。但是到了GetUIObjectOf就写不下去了老是出错,请各位大虾帮我看看吧!
IShellFolder * mf ;
IShellFolder * folder ;
IExtractImage * extractImage ;
LPITEMIDLIST pidl ;
unsigned long * char_len = new unsigned long();

OleCheck(SHGetDesktopFolder(&mf)) ;
if( !OpenDialog1->Execute())
{
ShowMessage("打开文件失败!") ;
return ;
}

LPOLESTR * dispName ;
AnsiString path = ExtractFilePath(OpenDialog1->FileName) ;
wchar_t * n = new wchar_t[50];
path.WideChar( n , path.Length() + 1) ;
dispName = & n ;

//问题一:下边这句,如果用LPITEMIDLIST * pidl这种方式声明pidl,在下句
//中把& pidl 换成pidl,程序就会出错。为什么呢?

OleCheck(mf->ParseDisplayName( this, NULL, * dispName , char_len , & pidl , 0 ));
LPVOID ppvResult ;
LPVOID un ;
OleCheck( mf->BindToObject( (LPCITEMIDLIST)( pidl) , NULL , IID_IShellFolder , & ppvResult ) );
folder =(IShellFolder*) ( ppvResult ) ;
//问题二:执行到下句就出错:“参数错误”
OleCheck( folder->GetUIObjectOf(NULL , 1 , (LPCITEMIDLIST *)&pidl , IID_IExtractImage , NULL , & un ) ) ;
extractImage = (IExtractImage *) (&un) ;
//问题三:以下还要通过IExtractImage::GetLocation()和IExtractImage::Extract
//得到我要的缩略图,但我实在写不下去了,请高手帮帮忙吧!
delete [] n ;
...全文
292 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2004-05-13
  • 打赏
  • 举报
回复
对于这个类不是太熟...
acneyouth 2004-05-13
  • 打赏
  • 举报
回复
经过了漫长的、艰苦卓绝的猜测、修改,终于解决了所有的编译错误和运行时的异常,现在只剩最后一个问题了:我已经得到了HBITMAP类的结果,但我不知到它是个什么东东,以及如何用TImage来显示它,请各位大虾帮帮忙!
acneyouth 2004-05-13
  • 打赏
  • 举报
回复
我自己解决了,哈哈!现在已经成功显示.ai,.psd等类型的图片了!
方法是
Image1->Picture->Bitmap->Handle=...
蒋晟 2004-05-08
  • 打赏
  • 举报
回复
CFolderItemInfo是我自己写的类。bmp/jpg显示的时候用的是IPicture来显示文件内容。你可能需要修改选项中的包含文件和库文件的顺序
蒋晟 2004-05-08
  • 打赏
  • 举报
回复
CFolderItemInfo是我自己写的类。bmp/jpg显示的时候用的是IPicture来显示文件内容。你可能需要修改选项中的包含文件和库文件的顺序
acneyouth 2004-05-06
  • 打赏
  • 举报
回复
回HalfWorm:

函数声明中要的就是LPITEMIDLIST *,而不是LPITEMIDLIST,我的意思是
LPITEMIDLIST * pidl;
mf->ParseDisplayName( ... pidl ... )
和下边的程序应该是等价的
LPITEMIDLIST pidl;
mf->ParseDisplayName( ... &pidl ... )
可是使用第一种形式会出错,API调用中我好几次遇到这种情况,为什么呢?

蒋大虾的大作正在研究中..............
acneyouth 2004-05-06
  • 打赏
  • 举报
回复
我怀疑是不是我的库文件太老了,我访问了蒋大虾文章中的SDK下载地址,照ms的提示做了安装,不知道还需不需要做些别的什么工作来让BCB使用新的SDK?
acneyouth 2004-05-06
  • 打赏
  • 举报
回复
请问蒋大虾,你获取缩略图用的是不是GetIconOf()?我看MSDN中的函数声明是这样的:
HRESULT GetIconOf(
LPCITEMIDLIST pidl,
UINT flags,
LPINT lpIconIndex
);
其中lpIconIndex的取值如下:
0 Document (blank page, not associated)
1 Document (with data on the page)
2 Application (file extension must be .exe, .com, or .bat)
3 Folder (plain)
4 Folder (open)
从上边看只能取文件夹.doc、.exe等文件的图标,没说能取.bmp、.jpg等文件的图标啊?
而且你在这个参数的位置上用的是CFolderItemInfo *类型的变量,我查不到这种类型的帮助,不知道它究竟是什么东东,看起来象是MFC。
我没学过MFC,请大虾多说两句,谢谢!
netying 2004-05-01
  • 打赏
  • 举报
回复
帮你顶
蒋晟 2004-05-01
  • 打赏
  • 举报
回复
咳咳
http://www.csdn.net/develop/read_article.asp?id=22243
我没用IExtractImage……

HalfWorm 2004-05-01
  • 打赏
  • 举报
回复
问题一: LPITEMIDLIST * pidl 是定义了一个指向LPITEMIDLIST的指针,而它需要的是LPITEMIDLIST这个指针的地址所以会出错。
问题二: 第三个参数 (LPCITEMIDLIST *)&pidl 转换出错。 同上,参数需要的是LPCIITEMIDIST不是LPCITEMIDLIST*
第三个问题: 我没有做过IExtractImage,不知道你所说的缩略图是否就是图标,如果你需要的是得到图标。
前一段时间做的windows shell 忘得差不多了。 说错了请大家见谅
sun_wyz 2004-04-30
  • 打赏
  • 举报
回复
我也帮你顶!关注
TomSonChina 2004-04-30
  • 打赏
  • 举报
回复
帮你顶
acneyouth 2004-04-30
  • 打赏
  • 举报
回复
头疼!
//指定视频采集设备的友好名字,为它创建一个Filter IBaseFilter * CTestPreviewDlg::CreateVideoDevice(const char * inFriendlyName) { return CreateHardwareFilter(CLSID_VideoInputDeviceCategory,inFriendlyName); } //根据设备的友好名字,创建一个代表该设备的Filter IBaseFilter * CTestPreviewDlg::CreateHardwareFilter(GUID inCategory,const char * inFriendlyName) { //创建一个系统枚举组件对象 ICreateDevEnum * enumHardware = NULL; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_ALL, IID_ICreateDevEnum,(void**)&enumHardware); if(FAILED(hr)) { return NULL; } IBaseFilter * hardwareFilter = NULL; IEnumMoniker * enumMoniker = NULL; //为指定的目录创建枚举器 hr = enumHardware->CreateClassEnumerator(inCategory,&enumMoniker,0); if(enumMoniker) { enumMoniker->Reset(); ULONG fetched = 0; IMoniker * moniker = NULL; char friendlyName[256]; //枚举得到该目录下所有的设备,逐个进行名字匹配 while(!hardwareFilter && SUCCEEDED(enumMoniker->Next(1,&moniker, &fetched)) && fetched) { if(moniker) { IPropertyBag * propertyBag = NULL; VARIANT name; friendlyName[0] = 0; hr = moniker->BindToStorage(0,0,IID_IPropertyBag,(void**)&propertyBag); //读取设备的友好名字 if(SUCCEEDED(hr)) { name.vt = VT_BSTR; hr = propertyBag->Read(L"Friendlyname",&name,NULL); } if(SUCCEEDED(hr)) { WideCharToMultiByte(CP_ACP,0,name.bstrVal,-1, friendlyName,256,NULL,NULL); //如果当前设备的友好名字与用户指定的设备名字相同, //则将当前设备标识绑定为Filter形式 if(strcmp(friendlyName,inFriendlyName) == 0) { moniker->BindToObject(0,0,IID_IBaseFilter, (void**)&hardwareFilter); } } //释放使用过的接口 if(propertyBag) { propertyBag->Release(); propertyBag = NULL; } moniker->Release(); } } enumMoniker->Release(); } enumHardware->Release(); return hardwareFilter; }

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧