涉及到一个bug,关于文件如何读取,记录下来,恩
char* szFileName = _tempnam( _DNTN("c:/temp"), _DNTN("CustomThunbnail"));
if(szFileName)
{
CString strFileName(szFileName);
CFile file;
file.Open(strFileName, CFile::modeRead | CFile::shareDenyNode);
DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);
LPVOID lpBuf = ::GlobalLock(hMem);
file.Read(lpBuf, dwSize);
file.close();
::GlobalUnlock(hMem);
IStream* pStream(NULL);
IPicture* pPicture(NULL);
long hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);
if( hr == S_OK)
continue;
hr = OleLoadPicture(pStream, dwSize, TRUE, IID_IPicture, (LPVOID*)&pPicture);
if( hr == S_OK)
continue;
}
函数CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM* ppstm);
该函数的功能是在全局内存区域创建一个流对象。
hGlobal是由函数GlobalAlloc()分配的内存句柄,该句柄必须是可移动的。如果该句柄可以在进程之间可以共享,那么在分配内存的时候一定以共享的形式分配。一个新的句柄的尺寸是0。如果hGlobal值为空,那么CreateStreamOnHGlobal()函数将会分配一个新的尺寸为0 的共享内存块。第二个参数是说当流对象被释放的时候,该流的句柄是否被自动释放,为真,程序将自动释放流对象。第三个参数ppstm存储的是一个指向输入流对象的指针变量的地址,该指针变量指向的是一个新的流对象的接口。该值不能为空。当函数CreateStreamOnHGlobal()的返回值为S_OK,说明流对象创建成功。
流对象的初始内容就是由hGlobal参数所提供的内存块内所存储的内容。如果hGlobal为空,函数CreateStreamOnHGlobal()将在内部分配内存。
当你通过函数CreateStreamOnHGlobal()创建流对象成功,你也可以通过函数GetHGlobalFromStream()
得到与该流对象相关的全局内存的句柄。
函数OleLoadPicture(IStream* pStream, LONG lSize, BOOL fRunmode, REFIID riid, VOID ppvObj);
该函数的功能是创建一个新的picture对象,并通过流中的内容来初始化该图形对象。这个函数相当于调用函数OleCreatePictureIndirect*NULL,...),然后调用IPersistStream::Load。
Note:这个流pStream的内容必须是以BMP,WMF,或者是ICO的形式存在。由OleLoadPicture()创建的图形对象管理该对象的内部资源。
该函数支持标准返回值E_OUTOFMEMORY和E_UNEXPECTED,它有时也会返回S_OK, E_POINTER和E_NOINTERFACE。
S_OK,表示图形创建成功。
E_POINTER,表示pStream或者ppvObj中地址是无效的,也可能是空值。
E_NOINTERFACE,表示该对象不支持在riid中指定的接口。
第一个参数pStream,指向一个流对象,该流记录着有关图片的数据。
第二个参数lSize,是指在流中的字节数目。
第三个参数fRunmode,the opposite of the initial value of the picture's property。The opposite of the initial value of the KeepOriginalFormat property. If TRUE, KeepOriginalFormat is set to FALSE and vice-versa.
第四个参数riid,接口标识符,该标识符描述了以ppvObj返回的接口指针的类型。
第五个参数ppvObj,存储的是输出变量的地址,该输出变量接受的是一个接口指针。