c# 讀取IntPtr 中的數據


c++的寫法是這樣的:
LRESULT CPictureQueryDlg::OnQueryPicNty(WPARAM wp, LPARAM lp)
{
EnableWindow(TRUE);

BYTE *pbyMsg = (BYTE*)lp;

// 得到當前頁數目
m_dwCurCount = *reinterpret_cast<DWORD*>(pbyMsg);
// 得到總數量
m_dwTotalCount = *reinterpret_cast<DWORD*>(pbyMsg + sizeof(DWORD));

// 得到查詢結果指針
TNVR_PIC_GRABTASK* ptResultQuery = reinterpret_cast<TNVR_PIC_GRABTASK*>(pbyMsg + sizeof(DWORD)*2);
memset(m_atGrTask, 0, sizeof(TNVR_PIC_GRABTASK) * NVR_MAXNUM_RECORDQUERY);
memcpy(m_atGrTask, ptResultQuery, m_dwCurCount * sizeof (TNVR_PIC_GRABTASK));
}

 

已經拿到IntPtr了的話可以用類型強制轉換獲取IntPtr里的東西:

?
1
2
3
(要獲取的類型)Marshal.PtrToStructure(ptr, typeof (要獲取的類型));
//這樣就轉換到你c#可以操作的數據類型然后來讀取內容,
//我不知道這個在你那里能否適用,因為PtrToStructure並不是所有情況都適用,如果用這個方法的話具體可以看看MSDN

 主要是需要獲得類型的長度,如果長度獲得不准確,讀到的數據就會有問題。
(StructureType)Marshal.PtrToStructure((IntPtr)((uint)(pbyMsg + sizeof(uint) * 2 + i * Marshal.SizeOf(typeof(StructureType)))), typeof(StructureType));

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
  
namespace OpenCover.Framework.Communication
{
     public interface IMarshalWrapper
     {
         T PtrToStructure<T>(IntPtr pinnedMemory);
         void StructureToPtr<T>(T structure, IntPtr pinnedMemory, bool fDeleteOld);
     }
  
     public class MarshalWrapper : IMarshalWrapper
     {
         public T PtrToStructure<T>(IntPtr pinnedMemory)
         {
             return (T)Marshal.PtrToStructure(pinnedMemory, typeof (T));
         }
  
         public void StructureToPtr<T>(T structure, IntPtr pinnedMemory, bool fDeleteOld)
         {
             Marshal.StructureToPtr(structure, pinnedMemory, fDeleteOld);
         }
     }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM