如何构造一个元素类型为Struct的SafeArray
来源:互联网 发布:博客界面的php源码 编辑:程序博客网 时间:2024/06/07 21:04
在有些时候,我们需要构造一个元素类型为Struct的SafeArray,在MSDN并没有文档解释到底应该如何去做到这一点,下面的代码片断解释了如何去构造这样一个SafeArray。
假设我们有如下的Struct:
struct myStruct
{
unsigned char Name[255];
short Kind;
};
为了构造一个SafeArray,元素类型为mxStruct,首先我们必须得拿到mxStruct所对应的IRecordInfo接口,这可以通过调用GetRecordInfoFromGuids函数实现:
#import "TestStruct.tlb" no_namespace
HRESULT hr;
IRecordInfo *pRecordInfo;
hr = GetRecordInfoFromGuids(
__uuidof(TestStruct),
1,
0,
LOCALE_USER_DEFAULT,
__uuidof(mxStruct),
&pRecordInfo);
GetRecordInfoFromGuids在注册表中查询对应的Record信息,这个注册表信息位于HKCR/Record下,同时,对应的TypeLib也必须被注册在HKCR/TypeLib下面,这样GetRecordInfoFromGuids才可以查到对应的信息并返回IRecordInfo*指针。当获得了这个指针的时候,便可以通过CreateSafeArrayVectorEx来构造SafeArray:
SAFEARRAY *pArray = SafeArrayCreateVectorEx(VT_RECORD, 0, 3, pRecordInfo);
该行调用SafeArrayCreateVectorEx构造一个元素为pRecordInfo指定的结构,也就是myStruct的SafeArray,LowBound为0,元素个数为3。
对这个SafeArray中的元素赋值可以通过SafeArrayAccessData和SafeArrayUnaccessData做到:
myStruct *pStructs;
SafeArrayAccessData(pArray, (void **)&pStructs);
strcpy((char *)&pStructs[0].Name[0], "N1");
pStructs[0].Kind = 0;
strcpy((char *)&pStructs[1].Name[0], "N2");
pStructs[0].Kind = 1;
strcpy((char *)&pStructs[2].Name[0], "N3");
pStructs[0].Kind = 2;
SafeArrayUnaccessData(pArray);
SafeArrayAccessData获得数组的指针,用于修改数据,并Lock该SafeArray,防止被SafeArray被释放。而SafeArrayUnaccessData则Unlock这个SafeArray。
至此SafeArray构造完毕,可以传递给其他的COM组件了。如果有兴趣的话,可以参考MSDN Forum中提出的一个类似的问题:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1994951&SiteID=1&mode=1
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- 如何构造一个元素类型为Struct的SafeArray
- Mule 1.4对JBPM的集成
- 对话Firefox Gecko内核开发者:李沫南
- 为什么大多数大型网站不是用Java写的
- 并非中庸之道——我看开源与微软
- 如何将 DBCC INDEXDEFRAG 执行的结果插入到表中
- 如何构造一个元素类型为Struct的SafeArray
- Mule - 企业服务总线
- 扎根IE开发拥有自己理想的程序员--张硕
- Windows Vista真的只是加了新界面吗?
- Web Service难道又是一个美丽的童话?
- 在全文索引建立的目录不存在情况下删除全文索引
- 做事的态度与工作态度
- 开始使用SmartDraw绘制开发中的各种图形
- PC时代IE浏览器获胜,Web时代呢?