C#のIntPtr
8149 ワード
IntPtrは、WindowsAPI関数を呼び出すポインタをパッケージ化するクラスであり、プラットフォームによっては、下位ポインタは32ビットまたは64ビットであってもよい.ポインタまたはハンドルのプラットフォーム固有のタイプを表すために使用され、C#では主にC+CパッケージのDllライブラリを呼び出すために使用されます.以下、主にIntPtrの一般的な使い方を紹介します.
1.intタイプとIntPtrタイプの変換
2.stringタイプとIntPtr間の変換
3.構造体とIntPtr間の変換
転載先:https://www.cnblogs.com/QingYiShouJiuRen/p/10274197.html
1.intタイプとIntPtrタイプの変換
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace MyIntPtr
{
class Program
{
static void Main(string[] args)
{
int nValue1 = 10;
int nValue2 = 20;
//AllocHGlobal(int cb): , 。
IntPtr ptr1 = Marshal.AllocHGlobal(sizeof(int));
IntPtr ptr2 = Marshal.AllocHGlobal(sizeof(int));
//WriteInt32(IntPtr ptr, int val): 32 。
//int->IntPtr
Marshal.WriteInt32(ptr1, nValue1);
Marshal.WriteInt32(ptr2, nValue2);
// ReadInt32(IntPtr ptr, int ofs): 32
//IntPtr->int
int nVal1 = Marshal.ReadInt32(ptr1, 0);
int nVal2 = Marshal.ReadInt32(ptr2, 0);
//FreeHGlobal(IntPtr hglobal): 。
Marshal.FreeHGlobal(ptr1);
Marshal.FreeHGlobal(ptr2);
}
}
}
2.stringタイプとIntPtr間の変換
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace MyIntPtr
{
class Program
{
static void Main(string[] args)
{
string str = "aa";
IntPtr strPtr = Marshal.StringToHGlobalAnsi(str);
string ss = Marshal.PtrToStringAnsi(strPtr);
Marshal.FreeHGlobal(strPtr);
}
}
}
3.構造体とIntPtr間の変換
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace MyIntPtr
{
class Program
{
public struct stuInfo
{
public string Name;
public string Gender;
public int Age;
public int Height;
}
static void Main(string[] args)
{
stuInfo stu = new stuInfo()
{
Name = " ",
Gender = " ",
Age = 23,
Height = 172,
};
//
int nSize = Marshal.SizeOf(stu);
//
IntPtr intPtr = Marshal.AllocHGlobal(nSize);
//IntPtr->Struct
Marshal.StructureToPtr(stu, intPtr,true);
//Struct->IntPtr
stuInfo Info =(stuInfo)Marshal.PtrToStructure(intPtr, typeof(stuInfo));
Console.ReadKey();
}
}
}
転載先:https://www.cnblogs.com/QingYiShouJiuRen/p/10274197.html