2014-02-12 88 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