【C#】IntPtr的使用

IntPtr 是 C# 中的一个类型,用于表示一个指向非托管内存的指针。它主要用于与需要指针的非托管函数进行互操作,尤其是在使用 P/Invoke 调用 Win32 API 或其他非托管代码时。IntPtr 可以在 32 位和 64 位系统上工作,它的大小会根据平台自动调整(32 位平台上是 32 位,在 64 位平台上是 64 位)。

以下是一些 IntPtr 的常见用途:

P/Invoke: 当你需要从 C# 代码中调用非托管的 DLL 函数时,可以使用 IntPtr 来传递或接收指针参数。

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

句柄: 在 Windows 编程中,经常需要处理各种类型的句柄,如窗口句柄、文件句柄等,这些通常都可以用 IntPtr 类型来表示。

IntPtr hwnd = FindWindow(null, "Notepad");

分配和释放非托管内存: 使用 Marshal 类的 AllocHGlobalFreeHGlobal 方法可以分配和释放非托管内存,并返回一个 IntPtr 指向这块内存。

IntPtr ptr = Marshal.AllocHGlobal(100); // 分配100字节
try
{
    // 使用ptr...
}
finally
{
    Marshal.FreeHGlobal(ptr); // 释放内存
}

数据转换: 你可以将 IntPtr 转换为整数类型(例如 intlong),但需要注意的是,在 64 位平台上,IntPtr 的大小为 64 位,因此可能无法安全地转换为 int。通常建议使用 Int64 进行转换。 

long value = (long)ptr;
IntPtr newPtr = (IntPtr)value;

作为方法参数: 当你定义的方法需要接受一个指针或者句柄时,可以使用 IntPtr 作为参数类型。

public void SomeMethod(IntPtr handle)
{
    // 使用handle...
}

固定数组元素: 如果你需要将托管数组中的元素地址传递给非托管代码,可以使用 fixed 语句配合 IntPtr 来固定数组元素的位置。

int[] numbers = { 1, 2, 3, 4, 5 };
fixed (int* pNumbers = numbers)
{
    IntPtr numbersPtr = (IntPtr)pNumbers;
    // 将numbersPtr传递给非托管代码
}

注意:当使用 IntPtr 时,一定要小心管理资源,确保不会造成内存泄漏,并且正确地处理异常情况下的资源清理。

 

 

C# IntPtr转byte数组、byte[]转Intptr、IntPtr转byte[]、IntPtr转换为raw数据、Marshal.Copy方法-CSDN博客

C# 进行图像处理的几种方法(Bitmap,BitmapData,IntPtr)_c# bitmap-CSDN博客

C# byte[]、struct、intptr、byte[]和byte*等的相互转换_c# struct byte[]-CSDN博客

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902861.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3.堆栈的理解

堆栈是同一段进行插入删除的线性表 (先入后出) 栈式最基础的常见的数据结构之一 进入一个新的函数的时候 会开辟一个空间,存放需要的数据 int add(int a,int b,int c) {return abc } int main() {add(1,2,3) }//add(1&#xff…

Redis 线程控制 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 线程控制 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 线程控制 & 总结》(学习总结/最新最准/持续更新)《Redis &a…

https://huggingface.co/上的模型无法用linux服务器clone怎么办(只需要稍微改一下网址,就可以切换到镜像下载)

问题描述: 在ubuntu系统上,使用如下命令,克隆仓库,报无法访问错误: git clone https://huggingface.co/distilbert/distilroberta-base通用解决方案: 把下面部分更换: https://huggingface.…

Scrapy框架原理与使用流程

一.Scrapy框架特点 框架(Framework)是一种软件设计方法,它提供了一套预先定义的组件和约定,帮助开发者快速构建应用程序。框架通常包括一组库、工具和约定,它们共同工作以简化开发过程。scrapy框架是python写的 为了爬…

为什么有0.35/Tr这一信号带宽定义

从频域幅值函数可以近似认为这是一个低通滤波器模型,可以采用RC网络模型来处理,根据电路理论计算电压10%到90%所需上升时间,再根据滤波器频域特性计算幅值在-3db处的频率极限,通过两个关系式可以计算出频率极大值和上升时间关系&a…

<<机器学习实战>>15-26节笔记:逻辑回归参数估计、梯度下降及优化、模型评价指标

梯度下降缺点:有可能有鞍点(如果不是凸函数的时候),不一定能找到最小值解决方法:随机梯度下降(选一条数据)和小批量梯度下降(选几条数据这两个解决方法又会带来新问题,比…

51单片机完全学习——LCD1602液晶显示屏

一、数据手册解读 通过看数据手册我们需要知道,这个屏幕每个引脚的定义以及如何进行发送和接收。通过下面这张图我们就可以知道,这些引脚和我们的编程是有关的,需要注意的是,这里我们在接线的时候,一定要把DB0-DB7接到…

变流升压一体机:能源领域的新兴力量与优秀品牌

在当今能源转型的大背景下,变流升压一体机作为一种创新型的电力设备,正逐渐成为新能源领域的关键角色。 变流升压一体机是一种综合性很强的光伏箱式变电站设备,它将储能变流器、升压变压器、高压环网柜、低压配电箱等多种设备集成在一个集装箱…

LeetCode.冗余连接(并查集以及广度优先搜索)

684.冗余连接| 传送门:. - 力扣(LeetCode) 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中…

上线 24 小时,爆了!

产研团队(兼客服)已爆单🔥🚀💥!(bushi) 在此由衷感谢各位小伙伴的信任🤩! 还没有试用的小伙伴赶紧去围观👇️👇️👇️ …

高效数据集成案例:从聚水潭·奇门到MySQL

聚水潭奇门数据集成到MySQL的技术案例分享 在企业信息化建设中,数据集成是实现业务流程自动化和数据统一管理的关键环节。本文将分享一个具体的系统对接集成案例:如何将聚水潭奇门平台上的销售出库单数据高效、可靠地集成到MySQL数据库中,以…

AUTOSAR-Com模块

COM 文章目录 COMCOM 基础介绍COM主要功能AUTOSAR COM 模块 发送模型Signal 信号/信号组发送信号属性—Triggered属性Pending属性信号的初始化信号的对齐方式(大小端)信号的收发发送接收 字节序转换和符号扩展信号的过滤机制过滤处理信号传输模式信号流和…

【十进制转十六进制数】

【十进制转十六进制数】 C语言版本C 版本Java版本Python版本 💐The Begin💐点点关注,收藏不迷路💐 从键盘接收一个整数,编程实现将其转换成十六进制数。 输入 一个整数 输出 十六进制数 样例输入 100样例输出 6…

day01-ElasticStack+Kibana

ElasticStack-数据库 #官网https://www.elastic.co/cn/ #下载7.17版环境准备 主机名IP系统版本VMware版本elk110.0.0.91Ubuntu 22.04.417.5.1elk210.0.0.92Ubuntu 22.04.417.5.1elk310.0.0.93Ubuntu 22.04.417.5.1 单机部署ES 1.下载ES软件包,放到/usr/local下 […

HTML3D旋转相册

文章目录 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐

react18中react-thunk实现公共数据仓库的异步操作

redux及react-redux都只能实现数据的同步修改更新,有点类似于vue中的mutation,只能做同步操作,异步的话不用actions来实现。由于在项目始终不可避免要实现的异步数据的更新,这明显不够用了。是时候引入我们的异步中间件redux-thun…

计算机组成原理笔记9(指令系统,立即寻址,直接寻址,间接寻址.....)

指令操作码 操作码的位数决定了不同功能指令的多少,位数越多,所能表示的操作功能就越丰富。指令的操作码通常有两种编码格式: 定长操作码 定长操作码对于简化硬件设计,减少指令译码时间非常有利,例如IBM370指令系统&a…

Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用,森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数,造成重大的损失。如果有一款监测软件,从硬件处获得的图像中监测是否有火焰,从而报警&#xff0…

uv: 一个统一的Python包管理工具

uv是由Astral公司开发的一个极其快速的Python包管理器,完全用Rust编写。它最初在2月份发布,作为pip工作流的替代品。现在,uv已经扩展成为一个端到端的解决方案,可以管理Python项目、命令行工具、单文件脚本,甚至Python本身。可以说,uv就像是Python界的Cargo:一个快速、可靠、易…

XQT_UI 组件|03 |加载组件 XQtLoading

XQtLoading 使用文档 简介 XQtLoading 是一个自定义的加载动画组件,旨在为用户提供可配置的旋转花瓣动画效果。它可以在应用程序中用于指示加载状态,提升用户体验。 特征 可配置性:用户可以根据需求调整旋转周期、缩放周期、最大/最小缩放…