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);
}
}
}
|