IntPtr问题】的更多相关文章

1.struct byte[]互相转换 //struct转换为byte[] public static byte[] StructToBytes(object structObj) { int size = Marshal.SizeOf(structObj); IntPtr buffer = Marshal.AllocHGlobal(size); try { Marshal.StructureToPtr(structObj, buffer, false); byte[] bytes = new…
示例代码: IntPtr vertex = someObj.Get().Lock(0, someObj.Get().GetSizeInBytes(), HardwareBuffer.LOCKOPTIONS.HBL_DISCARD);   C#中的IntPtr相当于C++中的int*,之所以在C#中存在IntPtr完全是为了兼容基于C/C++的DLL或LIB,通过上面的代码可以判断Lock的方法的返回值是一个整型指针.   其实不只是IntPtr,还可以是其他的***Ptr,但核心内容是任何***…
[DllImport("OpenNetStream.dll")] public static extern int OpenSDK_Data_GetDevList(IntPtr szAccessToken, int iPageStart, int iPageSize, ref IntPtr pBuf, ref int iLength); //其中pBuf参数,为返回的一个byte[]数据,现在要将其转换为byte[],然后在转换为string ; byte[] managedArray…
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool CloseHandle(IntPtr handle); [DllImport("kernel32", EntryPoint = "GetLastError")] public static extern int GetLastError(); Clos…
需要添加引用:System.Runtime.InteropServices 举例如下: float[] priors={1,10}; IntPtr intPtrSet = new IntPtr(); intPtrSet=Marshal.AllocCoTaskMem(Marshal.SizeOf(priors[0]*priors.Length)); Marshal.Copy(priors, 0, intPtrSet, priors.Length);…
本文转自:http://zhidao.baidu.com/question/22825956.html 问: c#中无法将类型“int”隐式转换为“System.IntPtr” 这个是我引用了一个api函数时出现的问题,我在声明中把intptr换成了int还是不可以,这是为什么呢?要如何处理呢?   答: 您好,C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄. 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称). 所…
之前,将数组.结构体等转换为IntPtr使用的是Marshal.Copy().Marshal.StructureToPtr(),但是有个问题自定义的结构体数组没法这样转化,一般网上给出的解决方法就是通过unsafe的代码段使用指针来转换. 今天看到一个函数GCHandle.Alloc(),其描述如下: public static GCHandle Alloc( Object value, GCHandleType type ) 参数value类型:System.Object使用 GCHandle…
转自 http://blog.sina.com.cn/s/blog_628821950100wh9w.html C#进行图像处理的几种方法 本文讨论了C#图像处理中Bitmap类.BitmapData类和unsafe代码的使用以及字节对齐问题. Bitmap类 命名空间:System.Drawing 封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成.Bitmap 是用于处理由像素数据定义的图像的对象. 利用C#类进行图像处理,最方便的是使用Bitmap类,使用该类的GetPixel(…
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 +…
方法一. int转IntPtr int i = 12;           IntPtr p = new IntPtr(i); IntPtr转int int myi = (int)p;           MessageBox.Show(myi.ToString()); 方法二. int转IntPtr int i = 12;           IntPtr p =(IntPtr)i IntPtr转int int myi = (int)p;           MessageBox.Show(m…
一:什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型.这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄.它是一个平台特定类型.对于它的解释,这个哥们写的比较好:It's a class that wraps a pointer that is used when calling Windows API functions. The underlying pointer may be 32 bit or 64 bit, depending on the…
//IntPtr转自定义结构 struct onlydata { IntPtr hwnd; }; onlydata pd=new onlydata(); IntPtr pd; pd=Marshal.PtrToStructure(pd,typeof(onlydata)); //自定义结构转IntPtr Marshal.StructureToPtr(data,pd,true);…
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 + sizeo…
public aaa(IntPtr myPtr,int left, int top, int width, short height) 这里myPtr应该是对应到一块内存,你需要查看aaa函数是如何把myPtr转化成它内部要使用的结构体的(一般都是结构体,也可能是其它对象,比如数组). 然后,你需要在你的托管代码中,定义该结构体,使用StructLayout特性,对结构体的字段使用MarshalAs特性,类似这样: [StructLayout(LayoutKind.Sequential, Cha…
  注意NET某些类型在不同平台上的长度 NET中用句柄用得最多的是在DLLIMPORT中,混用int与intptr可能会导致某些API声明在X64平台中表现不正常,如 [DllImport("Kernel32")] public static extern IntPtr LoadLibrary(string funcname); [DllImport("Kernel32")] public static extern long GetProcAddress(lon…
前因后果 调用一门锁的dll实现读取酒店IC卡数据,直接用Readme里的方法出错. 函数声明: 一.读卡函数    ************************ Delphi 调用 *************************    * function DLL_Read:PChar;                external 'AnLock_2012.dll'; stdcall;    *********************************************…
IntPtr是一个类,用于包装调用WindowsAPI函数的指针,根据平台的不同,底层指针可以是32位或64位:它用以表示指针或句柄的平台特定类型,C#中主要用它调用C++\C封装的DLl库:下面主要介绍IntPtr的常见用法 1.int类型与IntPtr类型之间的转换 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using Sys…
一:什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型.这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄.它是一个平台特定类型.对于它的解释,这个哥们写的比较好:It's a class that wraps a pointer that is used when calling Windows API functions. The underlying pointer may be 32 bit or 64 bit, depending on the…
Graphics.DrawImage 方法 在指定的位置使用原始物理大小绘制指定的 Image. 命名空间:System.Drawing 程序集:System.Drawing(在 system.drawing.dll 中) public void DrawImage ( Image image, Point point ) 参数 image 要绘制的 Image. point Point 结构,它表示所绘制图像的左上角的位置. public void DrawImagePoint(PaintEv…
知识点1:UIntPtr = NativeUInt = Pointer = Handle 随程序的位数改变而改变.如下: 所以以后再用指针的时候要这样:UintPtr/NativeUInt(实例) = 栈中指针内存编号 以下是代码研究: unit Unit5; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Con…
假设有 intPtr pBuffer 方法一: 直接使用Marshal.PtrToStringAnsi方法: string ss = Marshal.PtrToStringAnsi(pBuffer); 但,如果pBuffer中有\0,此方法所获取的字符串会被截断.这种情况要用方法二. 方法二: 先转为byte数组,然后再转string: byte[] cc = new byte[dwBufSize]; Marshal.Copy(pBuffer, cc, 0, (int)dwBufSize); s…
释放以前从进程的非托管内存中分配的内存. 命名空间:   System.Runtime.InteropServices程序集:  mscorlib(位于 mscorlib.dll) 下面的示例演示如何将托管的内容转换 String 类写入非托管内存,并因而释放非托管内存完成. using System; using System.Runtime.InteropServices; class MainFunction { static void Main() { Console.WriteLine…
在解析C#结构体指针前,必须知道C#结构体是如何定义的.在c#中同样定义该结构体. C#结构体指针之C#结构体的定义: [StructLayout(LayoutKind.Sequential)] public struct VGAStat { public int ChannelNum;//通道数量 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public char[] Version;//版本信息 public uint CPUU…
IntPtr idp= IntPtr.Zero; StringBuilder idata = new StringBuilder("000000"); string idata ="000000"; 我这样建立的2个idata字符串,如何让idp指向他 我指向他的目的是为了传递给dll的某个函数,他需要传指针 还有我定义了一个结构如何向dll的函数传递其指针? 所有分了,解决一起结了 用GCHandle.Alloc(object obj)方法来给string分配一个…
调用system.runtime.interopservice,可以用dllimport; API函数主要在“kernel32.dll”.“user32.dll”.“GDI32.dll”, kernel32.dll,以调用它下面的LoadLibrary.GetProcAddress.FreeLibrary.查MSDN了解了三个函数的原型为: HMODULE LoadLibrary(LPCTSTR lpFileName); FARPROC GetProcAddress(HMODULE hModul…
背景 公司的支付平台最近对接了西安移动的支付接口,接口中签名的方法是对方提供了一个com组件,组件中包含了一个签名的方法和一个验签的方法,注册了签名之后,在vs中进行了引用,引用之后,查看组件的定义如下: using System; using System.Runtime.InteropServices; namespace UMPAYLib { [ClassInterface()] [Guid("E92EB0AA-00CC-4F93-A76D-632BEA94E980")] [Ty…
//nSize 为总长度//pImageData 为总数据//nImageSize //一个图片的长度 byte[] _bytes = new byte[nImageSize];// //IntPtr infosIntptr = Marshal.AllocHGlobal(pImageData); Marshal.Copy(pImageData, _bytes, , nImageSize);//复制 PtrMoveSize(ref pImageData, nImageSize);//丛总内存中去掉…
一般写c#代码基本用不到 相互转换 只有调用c++中的dll动态库的时候才用的到 struct转intptr public static IntPtr StructToIntPtr<T>(T req) where T : struct { int size = Marshal.SizeOf(req); byte[] bytes = new byte[size]; IntPtr structPtr = Marshal.AllocHGlobal(size); Marshal.StructureTo…
写于2015-1-29 16:17 由qq空间转过来,格式有点乱 "互转"这里其实只是GC分配的一个IntPtr,通过这个IntPtr引用操作而真正的托管对象与非托管对象的互转应使用 Marshal.PtrToStructure 和 Marshal.StructureToPtr,这种互转要注意非托管内存的管理,不然就内存泄露了 这里通过GC分配IntPtr,主要是为了方便非托管代码对托管对象的引用,以前也用过这种方法,一时想不起来,又搜索了一下,这里就简单记录下…
 1. 获取数组的指针(IntPtr) 通过Marshal.UnsafeAddrOfPinnedArrayElement(Array,Int32)方法获得一个数组的第某个元素的内存地址. Array是数组,Int32是元素的索引,第一个元素是0. 例如: int[] ary; Intptr inp=Marshal.UnsafeAddrOfPinnedArrayElement(ary,0); Console.Writleline(inp.Tostring());//输出的就是一串数字,就是内存地址…