2014-02-12 52 views
-1

我得到了一个功能:如何将PVOID转换为int?

SAFEARRAY FAR* pArray = NULL;

和我得到的功能: pServer1->GetDirectMemory(dwAddrBegin, dwAddrEnd, wDisplayWidth, &pArray);

我想从粒子阵列获取的信息,如果我看它的结构,我有PVOID pvData;必须是包含我的信息。

我怎么能得到它在int?

老问题:

我想一个PVOID的数据得到一个int值

我得到一个SAFEARRAY FAR* pArray,我只有一个元素,所以我得到IR与PVOID类型一样, :

PVOID myData = pArray[0].pvData; 

我试图让与功能PtrToInt数据:

int myNbr = PtrToInt(myData); 

但我的int(myNbr)doens't没有得到相同的值,我可以看到我的调试器。 所以我的问题是如何从SAFEARRAY FAR* pArrayPVOID获得数据,而不使用MFC功能,如SafeArrayAccessData或其他。

由于

+0

你只是想一个指针转换成int,比如'INT P = reinterpret_cast的(PTR)'? – Sean

+1

'SafeArrayAccessData'在'OleAuto.h'标题中,你不需要包含MFC来访问它。 – Mgetz

+0

我在我的PVOID中得到一个地址,我想把这个地址的值放在一个int变量中 – Fred37b

回答

1

假设你的数组包含整数(使用SafeArrayGetVartype来验证),是一维(使用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结构(VARIANTSAFEARRAY等)时,应始终使用提供的实用程序功能。他们是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

+0

感谢您的回答。 也许它不是int,因为INT不包含正确的值。 – Fred37b

+0

我用μ控制器是16位时,我的计算机是在32位的工作,所以μP给我一个16位int和我的系统没有看到INT因为它,它必须是32位。 所以我改变的值的类型从int到字符,现在我收到我的变量。 感谢您的帮助 – Fred37b