我有一个功能:
SAFEARRAY FAR* pArray = NULL;
我得到了这个功能:
pServer1->GetDirectMemory(dwAddrBegin, dwAddrEnd, wDisplayWidth, &pArray);
我想从pArray获取信息,如果我查看它的结构,我PVOID pvData;
必须包含我的信息。
我怎么能在int中得到它?
旧问题:
我想将PVOID的数据转换为int值
我得到一个SAFEARRAY FAR* pArray
,我只有一个元素,所以我得到了一个像这样的PVOID类型:
PVOID myData = pArray[0].pvData;
我尝试使用PtrToInt函数获取数据:
int myNbr = PtrToInt(myData);
但我的int(myNbr)并没有得到我用调试器看到的相同值。
所以我的问题是如何在不使用SAFEARRAY FAR* pArray
之类的MFC功能的情况下从PVOID
或SafeArrayAccessData
获取数据。
由于
答案 0 :(得分:1)
假设您的数组包含整数(使用SafeArrayGetVartype
验证),是1维(使用SafeArrayGetDim
)和0(使用SafeArrayGetLBound
),访问它的正确方法是这样的:
int value;
LONG indices[] = { 0 };
if (FAILED(SafeArrayGetElement(pArray, indices, &value))) {
// getting element failed - probably bad index
}
// value now contains the correct value
您也可以使用SafeArrayAccessData
,但除非您发现了性能问题,否则最好不要这样做。
通常在处理OLE结构(VARIANT
,SAFEARRAY
等)时,应始终使用提供的实用程序函数。它们是Windows的一部分,而不是MFC。这是数组的参考:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms221145(v=vs.85).aspx
但是,如果可以,我强烈建议您使用ATL的SAFEARRAY包装器,CComSafeArray。请参阅文档和一篇显示其用法的简短博客文章:
http://msdn.microsoft.com/en-us/library/3xzbsee8.aspx http://msmvps.com/blogs/gdicanio/archive/2011/02/04/simplifying-safearray-programming-with-ccomsafearray.aspx