列集IPicture接口的问题,UP的也有分数

loveghb 2005-09-23 10:11:45
我用同样的方法列集2个指针,一个是recordset,一个是IPicture,前者成功,后者失败。前者基于IDispatch,后者基于IUnknown.代码如下:

列集recordset:
STDMETHODIMP CAdo::GetRecordset(IDispatch **ppVal)
{
_ConnectionPtr pConnection;
HRESULT hr;
hr = pConnection.CreateInstance(__uuidof(Connection));
if(SUCCEEDED(hr))
{
pConnection->Open("Provider=SQLOLEDB;Network Address=127.0.0.1;Initial Catalog=李行毕业设计","sa","sa",adModeUnknown);
}

_RecordsetPtr pRecordset;
pRecordset.CreateInstance("ADODB.Recordset");
CString temp = CString("SELECT * FROM 学生表");
_variant_t sql;
sql.SetString(temp);
pRecordset->CursorLocation = adUseClient;
hr = pRecordset->Open(sql, pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
pRecordset->PutRefActiveConnection(NULL);
pConnection->Close();
if(pRecordset==NULL)
{
*ppVal=NULL;
return S_OK;
}

*ppVal = pRecordset;
pRecordset->AddRef();

return S_OK;
}



列集IPicture:
STDMETHODIMP CMyIPicture::GetIPicture(IUnknown **ppValue)
{
*ppValue=NULL;
IStream *pStm=NULL;
CString m_sPath(L"c:\\windows\\web\\wallpaper\\Bliss.jpg");

FILE *pFile=NULL;
if ( NULL == (pFile = fopen(m_sPath, "rb")) )
return S_FALSE;

long FileSize = _filelength(_fileno(pFile));

HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, FileSize);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
long size = fread(pvData,sizeof(char),FileSize,pFile);
if (FileSize != size)
{
fclose(pFile);
return S_FALSE;
}
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}

fclose(pFile);
CComPtr<IPicture> pPicture;
HRESULT hr=OleLoadPicture(pStm,FileSize,TRUE,IID_IPicture,(LPVOID*)&pPicture.p);
if (S_OK == hr)
{
hr=pPicture->QueryInterface(__uuidof(IPicture), (void **)ppValue);
}

return hr;
}


尤其奇怪的是列集IPicture的时候,我跟踪到接口方法里,知道return hr前,hr的值都是S_OK的,但是返回到客户端就E_UNEXCEPTED的,未预料的错误,看来是列集出了点问题了。
大家帮我看看是为什么?

另外UP的也会有分数
...全文
163 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveghb 2005-09-27
  • 打赏
  • 举报
回复
哎,可能这样的方法本身就不对,还是传流算了。
goodboyws 2005-09-26
  • 打赏
  • 举报
回复
是否和数据在服务器有关??试试将读文件的代码和生成IPicture接口的代码分成两个接口来写
linzhengqun 2005-09-25
  • 打赏
  • 举报
回复
狂顶上去,好问题,希望有高手出来回答
teli_eurydice 2005-09-23
  • 打赏
  • 举报
回复
up
loveghb 2005-09-23
  • 打赏
  • 举报
回复
哦,晕,你的代码不是写在组件里的啊。
我的代码直到这句
hr=pPicture->QueryInterface(__uuidof(IUnknown), (void **)ppValue);
都是正确的,我的客户端和服务端分开的,是放在COM+里的。
如果放在一个工程里,写成普通函数,我的也可以的。
loveghb 2005-09-23
  • 打赏
  • 举报
回复
哦,我去试试!
loveghb 2005-09-23
  • 打赏
  • 举报
回复
我照你说的改了,但是还是老问题哦
:(
郁闷
goodboyws 2005-09-23
  • 打赏
  • 举报
回复
肯定是可以用的
goodboyws 2005-09-23
  • 打赏
  • 举报
回复
我的代码
Picture* LoadIPicture(
LPCTSTR FileName // image to load
)
{
// Use IPicture stuff to use JPG / GIF files
IPicture* p;
IStream* s;
HGLOBAL hG;
void* pp;
FILE* fp;
if (FileName == NULL || _tcscmp(FileName, "") == 0)
return NULL;

// Read file in memory
fp = fopen(FileName,"rb");
if (!fp)
return NULL;

fseek(fp,0,SEEK_END);
int fs = ftell(fp);
fseek(fp,0,SEEK_SET);
hG = GlobalAlloc(GPTR,fs);
if (!hG)
{
fclose(fp);
return NULL;
}
pp = (void*)hG;
fread(pp,1,fs,fp);
fclose(fp);

// Create an IStream so IPicture can
CreateStreamOnHGlobal(hG,false,&s);
if (!s)
{
GlobalFree(hG);
return NULL;
}

OleLoadPicture(s,0,false,IID_IPicture,(void**)&p);

if (!p)
{
s->Release();
GlobalFree(hG);
return NULL;
}
s->Release();
GlobalFree(hG);
return p;
}
goodboyws 2005-09-23
  • 打赏
  • 举报
回复
pPicture->QueryInterface(__uuidof(IPicture), (void **)ppValue);这句肯定不对
loveghb 2005-09-23
  • 打赏
  • 举报
回复
hr=pPicture->QueryInterface(__uuidof(IPicture), (void **)ppValue);
会自动AddRef的,自动释放了吗?好象不是吧?
ppValue会增加一个引用,CComPtr<IPicture> pPicture释放根本没问题
goodboyws 2005-09-23
  • 打赏
  • 举报
回复
你这个不叫列集
CComPtr<IPicture> pPicture;的问题,好像自动释放了,另外接口也不对
改为
IPicture* pPicture;
HRESULT hr=OleLoadPicture(pStm,FileSize,TRUE,IID_IPicture,(LPVOID*)&pPicture);
if (S_OK == hr)
{
hr=pPicture->QueryInterface(IID_IUnknown, (void **)ppValue);
}
pPicture->Release();

return hr;
}
goodboyws 2005-09-23
  • 打赏
  • 举报
回复
不应该是列集的问题。
loveghb 2005-09-23
  • 打赏
  • 举报
回复
怎么没人来呢!

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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