大侠们,救命啊,在线等,高分,谁来告诉我SAFEARRAY具体怎么用啊??

explosun 2003-10-15 03:07:40
如题
...全文
31 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingjust 2003-10-16
  • 打赏
  • 举报
回复
SAFEARRAY* psaDataID = NULL;


long lSize=prsID->RecordCount*sizeof(long);
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lSize;
psaDataID= SafeArrayCreate( VT_I4, 1, rgsabound );

SafeArrayAccessData( psaDataID, (void**)&plData );
for(int i=0;i<iCount;i++)
{
long lID=prsID->Fields->GetItem(L"DOCID")->Value;
plData[i]=lID;
prsID->MoveNext();
}
SafeArrayUnaccessData(psaDataID);
long lRet=-2;
SafeArrayDestroy(psaDataID);
atEleven 2003-10-15
  • 打赏
  • 举报
回复
http://www.codeproject.com/atl/udtdemo.asp
Eearbird 2003-10-15
  • 打赏
  • 举报
回复
你可以参考这个例子:
void GetScriptMaps()
{
IADsContainer* iContainer;
IADs* iAds;
VARIANT SC;
char s[5];
int i=0;
char dirName[MAX_PATH];
VARIANT path , state, sPort;
if(ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer)==S_OK) {
//得到默认站点
iContainer->GetObject(_bstr_t("IIsWebServer"), _bstr_t("1"),(IDispatch**)&iAds);
if(iAds==NULL) return ;
VariantInit(&sPort);
HRESULT hr=iAds->Get(_bstr_t("ScriptMaps"),&sPort);
if(SUCCEEDED(hr))
{
if(sPort.vt ==VT_ARRAY|VT_VARIANT)
{
SAFEARRAY* psa = sPort.parray;
VARIANT* varArray=NULL;
SafeArrayAccessData(psa,(VOID**)&varArray);
UINT uDim = SafeArrayGetDim(psa);
if(1==uDim)
{
long lLbound,lRbound;
SafeArrayGetLBound(psa,1,&lLbound);
SafeArrayGetUBound(psa,1,&lRbound);
for(long i=lLbound;i<=lRbound;i++)
{
if(varArray[i].vt==VT_BSTR)
{
_bstr_t bstmp(varArray[i].bstrVal,true);
printf((LPCTSTR)bstmp);
printf("\n");
}
}
SafeArrayUnaccessData(psa);
}
}
}
iAds->Release();
}
}
drip 2003-10-15
  • 打赏
  • 举报
回复
不懂,帮你up
说明文字在博客中。 摘录: 在学习的时候曾经百度了一下,想查找关于delphi中SafeArray的用法,没想到资料竟然如此之少,甚至连一篇相对完整的都没有。也许正如田师傅所说,现在高手们都在实行“技术封锁”了? 在CSDN技术中心有一篇关于C++的使用,说的比较详细。鉴于手中有田师傅写的代码,特拿来一部分对照自己学习的,翻译为Delphi版本。留作笔记,日后翻阅。 =============================================================================== SAFEARRAY的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元 素类型等信息。SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。在VARIANT的vt成员的 值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。 SafeArray中元素的类型可以是VARIANT能封装的任何类型,包括VARIANT类型本身。 Delphi中com组件或外部调用需要传递一个对象或者数组,这个时候可以考虑使用SafeArray。比如三层架构中通常需要将使用的ClientDataSet数据集传出,那么就可以将DataSet转换为SafeArray,再由其他模块转换接收。 ===============================================================================

3,245

社区成员

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

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