假设有 intPtr pBuffer 方法一: 直接使用Marshal.PtrToStringAnsi方法: string ss = Marshal.PtrToStringAnsi(pBuffer);
c#中无法将类型“int”隐式转换为“System.IntPtr” 这个是我引用了一个api函数时出现的问题,我在声明中把intptr换成了int还是不可以,这是为什么呢?要如何处理呢? 答: 您好,C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。 所以,在您调用的API函数中一定有类似窗体句柄这样的参数,那么当您声明这个函数时,您应该将它显式地声明为IntPtr类型。 0; 或者使用类型强制转换: mciSendString("set cdaudio door open", null, 0, (IntPtr)0 ); 或者,使用IntPtr构造函数: IntPtr IntPtr类型的变量,这样会使程序变得难于理解并容易出错。
System.Object System.ValueType System.IntPtr 1.C#中的IntPtr类型被称之为“平台特定的整数类型 3.在调用API函数时,类似含有窗口句柄参数(HANDLE)的原型函数,应显示地声明为IntPtr类型。 4.IntPtr类型对多线程操作是安全的。 5. int 和IntPtr互转 int i=1; IntPtr p=new IntPtr(i); int ch_i=(int) p; 6. IntPtr和string互转 string str="a"; IntPtr p=Marshal.StringToHGlobalAnsi(str); string s=Marshal.PtrToStringAnsi
1.C#中的IntPtr类型被称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄。 3.在调用API函数时,类似含有窗口句柄参数(HANDLE)的原型函数,应显示地声明为IntPtr类型。 4.IntPtr类型对多线程操作是安全的。 5. int 和IntPtr互转 int i=1; IntPtr p=new IntPtr(i); int ch_i=(int) p; 6. IntPtr和string互转 string str="a"; IntPtr p=Marshal.StringToHGlobalAnsi(str); string s=Marshal.PtrToStringAnsi
简介 最近在看代码时,发现了两个之前没见过的数据类型:intptr_t,uintptr_t。 intptr_t; # define __intptr_t_defined # endif typedef unsigned long int uintptr_t; #else # ifndef __intptr_t_defined typedef int intptr_t; # define __intptr_t_defined # endif typedef unsigned int 因此,就可以发现intptr_t和uintptr_t定义的巧妙之处: 在64位机器上,intptr_t为long int,uintptr_t为unsigned long int。 这样就可以保证intptr_t和uintptr_t的长度与机器的指针长度一致,因此在进行整数与 指针的相互转换时可以用intptr_t进行过渡。 下面写两个demo测试下。
IntPtr Reserved3; public IntPtr UniquePid; public IntPtr MoreReserved; public IntPtr fnNCDESTROY; public IntPtr fnDWORDOPTINLPMSG; public IntPtr fnINOUTDRAG public IntPtr fnPOUTLPINT; public IntPtr fnINLPCOMPAREITEMSTRUCT; public IntPtr public IntPtr fnHkINLPRECT; public IntPtr fnHkOPTINLPEVENTMSG; public IntPtr public IntPtr ClientCopyDDEOut2; public IntPtr ClientCopyImage; public IntPtr
///
static public extern bool GetMenuItemRect(IntPtr hWnd, IntPtr hMenu, code, IntPtr wParam, IntPtr lParam);
public static extern IntPtr SetWindowsHookEx(int hookid, CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam);
///
://定义托管方法public delegate void TIMCommCallback(Int32 code, IntPtr desc, IntPtr json_param, IntPtr ptr) //其他代码//...public static void MyTIMCommCallback(Int32 code, IntPtr desc, IntPtr json_params, IntPtr ptr desc, IntPtr json_param, IntPtr ptr); //functions - set callbacks ///
*, IntPtr*, int>)&QueryInterface; *(chunk + 2) = (IntPtr)(delegate* unmanaged<IntPtr, int>) + 4) = (IntPtr)(delegate* unmanaged<IntPtr, IntPtr, Guid*, IntPtr*, int>)&CreateInstance; *(chunk + 5) = (IntPtr)(delegate* unmanaged<IntPtr, bool, int>)&LockServer; *ppv = (IntPtr + 1); // 指向接口中每个方法的指针 (chunk + 1) = (IntPtr)(delegate unmanaged<IntPtr, Guid, IntPtr ; *(chunk + 5) = (IntPtr)(delegate* unmanaged<IntPtr*, IntPtr, Guid*, IntPtr*, int>)&Exports.CreateInstance
hProcess, IntPtr baseaddress, IntPtr buffer, int nsize, IntPtr bytesread); [DllImport("kernel32.dll IntPtr baseaddress, long[] buffer, int nSize, IntPtr byteswrite); 读写内存需要用到OpenProcess,官方文档里告诉我们第一个参数是访问权限 void WriteMemory(int pid,IntPtr toBase,int num) { IntPtr process = OpenProcess(0x1F0FFF, false, num1 = ReadMemory(pid, (IntPtr)0x006A9EC0); int num2 = ReadMemory(pid, (IntPtr)(num1 + 0x768)); hProcess, IntPtr baseaddress, IntPtr buffer, int nsize, IntPtr bytesread); [DllImport("kernel32
HANDLE System.IntPtr HBITMAP System.IntPtr HBRUSH System.IntPtr HCONV System.IntPtr HCONVLIST System.IntPtr HCURSOR System.IntPtr HDC System.IntPtr HDDEDATA System.IntPtr HDESK System.IntPtr HDROP System.IntPtr HDWP System.IntPtr HENHMETAFILE System.IntPtr HFILE System.IntPtr HFONT System.IntPtr HGDIOBJ System.IntPtr HGLOBAL System.IntPtr HHOOK System.IntPtr HICON System.IntPtr HIMAGELIST System.IntPtr HIMC System.IntPtr HMODULE System.IntPtr HMONITOR System.IntPtr HPALETTE System.IntPtr HPEN System.IntPtr HRGN System.IntPtr
_initTaskCompletionSource; private IntPtr _mainLoop; private IntPtr _context; { var result = pa_context_connect(context, IntPtr.Zero, 0, IntPtr.Zero public IntPtr server_name; pa_sample_spec sample_spec; public IntPtr public static extern int pa_context_connect(IntPtr c, IntPtr server, uint flags, IntPtr api); public static extern IntPtr pa_context_subscribe(IntPtr c, pa_subscription_mask_t m, IntPtr cb, IntPtr
, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero ) hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam ( IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam ); [DllImport hWnd, int nCmdShow); private static IntPtr CustomWndProc(IntPtr hWnd, uint msg, IntPtr wParam WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); private readonly WndProc _wndProc
= null && printerName.Length > 0) { IntPtr pPrinter = IntPtr.Zero; IntPtr pDevModeOutput = IntPtr.Zero; IntPtr pDevModeInput = IntPtr.Zero; IntPtr nullPointer = IntPtr.Zero; OpenPrinter(printerName, ref pPrinter, ref nullPointer IntPtr pDevModeOutput = IntPtr.Zero; IntPtr pDevModeInput = IntPtr.Zero; IntPtr nullPointer = IntPtr.Zero; OpenPrinter(printerName, ref pPrinter, ref nullPointer
windowHandle, IntPtr display, IntPtr rootWindow) { Display = display; RootWindow atoms[3] : IntPtr.Zero ); } private void SendNetWMMessage(IntPtr message_type, IntPtr l0, IntPtr? l1 = null, IntPtr? l2 = null, IntPtr? l3 = null, IntPtr? IntPtr.Zero, ptr3 = l2 ?? IntPtr.Zero, ptr4 = l3 ??
GetWindowLong(IntPtr hWnd, int nIndex); public static IntPtr SetWindowLong(IntPtr hWnd, int nIndex , IntPtr dwNewLong) { int error = 0; IntPtr result = IntPtr.Zero; // Win32 SetWindowLong doesn't clear error on success SetLastError(0); if (IntPtr.Size == 4) IntSetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong); [DllImport("user32.dll", EntryPoint , int nIndex, Int32 dwNewLong); private static int IntPtrToInt32(IntPtr intPtr) { return
例子说明 一个最简单操作即是IntPtr类型,它虽然是一个nint,但却是一个货真价实的指针,类似于C语言的*符号。 声明: IntPtr ptr; 如果要把托管def函数变成指针: 示例函数: public static void def() { Console.WriteLine("def 指针,,以上面指针functionPointer为例,向IntPtr指针指向的地址赋值: Marshal.WriteIntPtr(functionPointer,value); 读取IntPtr指针指向的地址值 代码如下: IntPtr ptr = getJit(); uint oldProtect; IntPtr ptr1 = Marshal.ReadIntPtr(Marshal.ReadIntPtr hook(IntPtr intptr); 调用 IntPtr ptr = getJit(); uint oldProtect; ptr1 = Marshal.ReadIntPtr(ptr); IntPtr
IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode ); [SecurityCritical SendMessageTimeout( IntPtr windowHandle, uint Msg, IntPtr wParam, IntPtr lParam, SendMessageTimeoutFlags flags, uint timeout, out IntPtr result , hPrinter, PrinterName, IntPtr.Zero, IntPtr.Zero, 0); if (iDevModeSize < 0) WM_SETTINGCHANGE, IntPtr.Zero, IntPtr.Zero,
")] private static extern IntPtr GetWindowLong64(IntPtr hWnd, int nIndex); [DllImport("user32 .dll", EntryPoint = "SetWindowLong")] private static extern IntPtr SetWindowLong32(IntPtr hWnd, int static extern IntPtr SetWindowLong64(IntPtr hWnd, int nIndex, IntPtr dwNewLong); } 整个 MainWindow.xaml.cs ")] private static extern IntPtr GetWindowLong64(IntPtr hWnd, int nIndex); [DllImport("user32 static extern IntPtr SetWindowLong64(IntPtr hWnd, int nIndex, IntPtr dwNewLong); } 本文代码放在 github 和 gitee
lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId; } [ intPtr = IntPtr.Zero; try { IntPtr hServer = IntPtr.Zero; if (WTSEnumerateSessions (hServer, 0, 1, out intPtr, out dwCount)) { var tmp = intPtr; for (var