在DCOM中,我想把一个Bitmap文件从服务器传到客户端,用什么传呢?用char**不行。我用数组传,又发现只有数组的第一个元素有值,我的传数组的方法是这样写的:(救命!!!)

AlexXXX 2001-09-27 08:04:35
在idl中
HRESULT GetText3([in] int cMax, [out,size_is(cMax)] int *rgs);

实现:
HRESULT CInsideCOM::GetText3(int cMax,int *rgs)
{
for(int n = 0; n < (cMax - 1); n++)
{
rgs[n] = n+5;
MessageBox(NULL,"hehe!","0Warning",MB_OK);
}
return S_OK;
}

调用:
int myArray[4];
pSObject->GetText3(4,&myArray);
...全文
136 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
noho 2001-10-24
  • 打赏
  • 举报
回复
//admire XT2
XT2能否留下联系方法,交流一下。
我的OICQ:2584348
jixian 2001-09-28
  • 打赏
  • 举报
回复
OK
XT2 2001-09-28
  • 打赏
  • 举报
回复
sorry,
hr = pSimple->GetBitmap((DWORD*)&h);
should be
hr = pSimple->GetBitmap(&h);
XT2 2001-09-28
  • 打赏
  • 举报
回复
The COM way is wire_marshal, which allow you provide some routines that will be called by proxy/stub code and pass bitmap info.

Generally you should implement HBITMAP_UserFree/HBITMAP_UserMarshal/HBITMAP_UserSize/HBITMAP_UserUnmarshal.

Fortunately there is a such implementation in ole32.dll, so you can do it directly.

so you can implement server this way
// idl file
[helpstring("")] HRESULT GetBitmap([out,retval] HBITMAP* pBitmap);


client side
{
HBITMAP h;
hr = pSimple->GetBitmap((DWORD*)&h);
}

you should import objidl.idl in your idl file, link ole32.lib in your proxy/stub project

AlexXXX 2001-09-28
  • 打赏
  • 举报
回复
IStream是什么东东?我是菜鸟,给个例子先。谢谢!
noho 2001-09-28
  • 打赏
  • 举报
回复
最好的办法是把BMP转换成IPicture,然后保存到IStream中,然后在客户端从IStream中读出IPicture,直接显示就可以了
zhxuys 2001-09-27
  • 打赏
  • 举报
回复
服务器端发送数据:
HRESULT RetrieveBLOBData(BSTR bstrID, VARIANT *pvarBLOB)
{
//输出参数:*pvarBLOB)
......
//取出ISequentialStream帮助类CISSHelper内部缓冲区m_pBuffer的数据
//------->pBufEx
BYTE *pBufEx;
pBufEx = (BYTE*)ISSHelper.m_pBuffer;

//建立安全数组psa,并把缓冲区pbuf的数据填充到psa中
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = ulTotal;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < (long)ulTotal; i++)
SafeArrayPutElement (psa, &i, pBufEx++);

//把安全数组包裹在VARIANT变量varBLOB中
//1.定义包裹变量varBLOB
VARIANT varBLOB;
VariantInit(&varBLOB);
V_VT(&varBLOB) = VT_ARRAY|VT_UI1;
V_ARRAY(&varBLOB) = psa;

//给输出参数赋值
*pvarBLOB = varBLOB;

//释放所有列缓存
this->FreeRecordMemory();

return S_OK;
}

客户端接收:
//调用行集RetrieveBLOBData()方法,取得指定图象索引号的位图-->varBLOB
VARIANT varBLOB;
hr = m_pSet->RetrieveBLOBData(m_strBitmapID.AllocSysString(), &varBLOB);
......

//确保varBLOB必须是VT_ARRAY | VT_UI1类型
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
//取出装载位图数据的安全数组上下界
long lLBound, lUBound;
SafeArrayGetLBound(varBLOB.parray, 1, &lLBound);
SafeArrayGetUBound(varBLOB.parray, 1, &lUBound);

//位图数据字节总数数
long lDataSize = lUBound - lLBound + 1;

//分配位图缓存m_pBMPBuffer
BYTE* m_pBMPBuffer;
if(m_pBMPBuffer = new BYTE[lDataSize+1]) //重新分配必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pBMPBuffer,pBuf,lDataSize); //复制数据到缓冲区m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);

//把位图内存数据转换为位图句柄
HBITMAP hBitmap = this->BufferToHBITMAP((LPSTR)m_pBMPBuffer);

//构造位图对象,并关联到位图句柄
CBitmap m_Bitmap;
m_Bitmap.Attach(hBitmap);

//将位图对象传递给CPictureHolder类对象
CPictureHolder m_Holder;
m_Holder.CreateFromBitmap(&m_Bitmap, NULL, TRUE);

//显示图象
m_Image.SetPicture(m_Holder.GetPictureDispatch());
m_Image.SetPictureSizeMode((long)1);

m_Image.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

//释放内存
delete m_pBMPBuffer;
}

}
AlexXXX 2001-09-27
  • 打赏
  • 举报
回复
老大,有例程吗?
zhxuys 2001-09-27
  • 打赏
  • 举报
回复
用VARIANT来包裹安全数组SAFEARRAY

3,245

社区成员

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

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