首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >IntPtr回调函数

IntPtr回调函数
EN

Stack Overflow用户
提问于 2014-07-15 04:36:30
回答 1查看 2.3K关注 0票数 3

我在C#中使用FFMPEG,并具有以下功能原型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static extern AVIOContext* avio_alloc_context(byte* buffer, int buffer_size, int write_flag, void* opaque, IntPtr read_packet, IntPtr write_packet, IntPtr seek);

在C/C++中,此函数声明如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
avio_alloc_context (unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))

在C/C++中,我可以执行以下操作来调用此函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int readFunction(void* opaque, uint8_t* buf, int buf_size)
{
    // Do something here
    int numBytes = CalcBytes();
    return numBytes;
}

int64_t seekFunction(void* opaque, int64_t offset, int whence)
{
   // Do seeking here
   return pos;
}

AVIOContext * avioContext = avio_alloc_context(ioBuffer, ioBufferSize, 0, (void*)(&fileStream), &readFunction, NULL, &seekFunction);

其中readFunctionseekFunction是用于读取/查找等的回调函数。

我不知道如何在代码的C#版本中复制这种行为,因为它需要一个IntPtr。如何创建回调函数并在C#版本中传递它们?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-16 06:47:49

事实证明,你可以做到这一点,但这并不完全是直观的。

首先,您需要使用UnmanagedFunctionPointer创建一个委托,并确保在使用[In, Out]进行修改后,可以将params从被调用方传递回调用方。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int av_read_function_callback(IntPtr opaque, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2), In, Out] byte[] endData, int bufSize);

在这个函数中,我们可以按照以下方式封送这个delegate

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private av_read_function_callback mReadCallbackFunc;

mReadCallbackFunc = new av_read_function_callback(ReadPacket);

mAvioContext = FFmpegInvoke.avio_alloc_context(mReadBuffer, mBufferSize, 0, null, Marshal.GetFunctionPointerForDelegate(mReadCallbackFunc), IntPtr.Zero, IntPtr.Zero);

在那里ReadPacket看起来像

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public int ReadPacket(IntPtr opaque, byte[] endData, int bufSize)
{
    // Do stuff here
}

这将导致与C++中的函数指针相同的行为。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24758386

复制
相关文章
Ubuntu下安装Python3和IDLE3
发现它是python2.*的,因为Ubuntu很多底层采用的是Python2.*,Python3和Python2是互相不兼容的,所以此时不能卸载Python2!!!需要将默认Python的指向Python3。
全栈程序员站长
2022/09/08
7820
Ubuntu下安装Python3和IDLE3
当我还在和ChatGPT聊天,有人已经开始用它来控制机器人干活了
机器之心报道 编辑:铭怿、蛋酱 ChatGPT 的功能目前已扩展到机器人领域,可以用语言直观控制如机械臂、无人机、家庭辅助机器人等的多个平台。这会改变人机交互的未来形式吗? 你可曾想过用自己的话告诉机器人该做什么,就像对人说话那样? 比如说,只要告诉你的家庭助理机器人「请帮我热一下午餐」,然后它就能自己找到微波炉。很神奇,对吗? 尽管语言是人类表达意图的最直观的方式,但此前很长一段时间,人们仍然严重依赖手写代码来实现对机器人的控制。不过,当 ChatGPT 出现之后,这种情况要变一下了。 在最近的一项研
机器之心
2023/02/28
5480
当我还在和ChatGPT聊天,有人已经开始用它来控制机器人干活了
Python 一个简单的读取excel例
笔者安装了python3版本,然后IDE安装了Pycharm,感受一下python的开发环境
py3study
2020/01/08
8790
如何在Windows上安装Python【Programming(Python)】
所以你想学习编程吗?Python是最常见的语言之一,它以面向对象的结构和简单的语法的独特结合而流行。Python还是一种解释型语言,这意味着您无需学习如何将代码编译为机器语言:Python可以帮您实现这一点,从而使您有时可以在编写代码的同时立即进行测试。
Potato
2019/12/01
1.9K0
如何在Windows上安装Python【Programming(Python)】
python3 virtualenv
在安装了python3之后,在项目开发的过程中,使用pip3进行库安装都会下载安装到环境变量设置好的地方,也就是python3安装的根目录下。 但是如果同时要开发多个不同的应用项目,而不同应用项目对于同一个库需要适配不同的版本,这种情况怎么办呢?
Devops海洋的渔夫
2019/05/30
3.3K0
Mu 入门:一个面向初学者的 Python 编辑器
Mu 是一个给初学者的 Python 编辑器,它旨在使学习体验更加愉快。它使学生​​能够在早期体验成功,这在你学习任何新知识的时候都很重要。
用户8639654
2021/10/21
2.1K0
CentOS7 安装 Python3.6
先看编译安装,编译安装后的文件目录基本和Windows平台上目录差不多。指定安装路径的话,所有的文件都是在一起的。 后面有yum的安装的方法。
py3study
2020/01/07
3.5K1
换掉 Maven,我用它!!!
相信使用Java的同学都用过Maven,这是一个非常经典好用的项目构建工具。但是如果你经常使用Maven,可能会发现Maven有一些地方用的让人不太舒服:
java进阶架构师
2021/02/05
5400
换掉 Maven,我用它!!!
选择篇(011)-当我们这样做时会发生什么?
参考答案:A 解析: 这在JavaScript中是可能的,因为函数也是对象!( 原始类型之外的所有东西都是对象) 函数是一种特殊类型的对象。您自己编写的代码并不是实际的函数。该函数是具有属性的对象,此属性是可调用的。
齐丶先丶森
2022/05/12
1920
Install Jumpserver12
进行编译安装[root@h165 Python-3.6.1]# ./configure && make && make installchecking build system type... x86_64-unknown-linux-gnuchecking host system type... x86_64-unknown-linux-gnuchecking for python3.6... nochecking for python3... nochecking for python... pytho
franket
2022/07/10
1510
Centos7 安装python3、pip3、ipython3
直接下载安装包如下: wget "https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz"
Devops海洋的渔夫
2019/05/31
1.4K0
再撩Python
如果你觉得很复杂,不要慌张,它本来就很复杂。 如果你觉得很简单,不要慌张,它本来就很简单。 --小浪 1、起手 还要把Python的开发环境说说。 2、Python安装 Python在各个操作系统上都有,所以Python代码天生就是跨平台的。在Windows上写好了代码,到Linux/Mac上不用改动一行代码,就平稳的跑起来了,感觉很鸡动有没有。 Python的安装也很方便的,在Windows下,到Python的官网(https://www.python.org/)上下安装包(选Python3的),双击后,
企鹅号小编
2018/01/25
6390
命令模式(Command)
1. 模式的定义 电脑开机的几个过程:1. 加载电源 2. 设备检查 3. 装载系统 客户端只是想要发出命令或者请求,不关心请求的真正接收者是谁,也不关心具体如何实现,而且同一个请求的动作可以有不同的
Java高级架构
2018/07/20
5320
Command – 命令模式
大部分应用都存在非常多的菜单和一些操作button,但在设计这些菜单和button的时候,并不知道它要运行什么样的操作。在设计删除、复制和撤销这些详细实现的时候,也不知道在要什么地方用到,可能是代码里面直接调用,也可能是界面上点击了某个button后发生的操作。为了解决菜单和详细操作的这样的耦合度,就须要使用Command-命令模式:
全栈程序员站长
2022/07/13
2560
Command – 命令模式
命令(Command)模式
命令(Command) Intent 将命令封装成对象中,具有以下作用: 使用命令来参数化其它对象 将命令放入队列中进行排队 将命令的操作记录到日志中 支持可撤销的操作 Class Diagram Command:命令 Receiver:命令接收者,也就是命令真正的执行者 Invoker:通过它来调用命令 Client:可以设置命令与命令的接收者 Implementation 设计一个遥控器,可以控制电灯开关。 public interface Command { void execut
MickyInvQ
2022/05/06
2400
命令(Command)模式
命令模式(Command)
命令模式是一种行为型模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。 简单来说,命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。
兜兜转转
2023/03/08
4940
命令模式(Command)
#PY小贴士# 为什么我 pip 装了库,代码里却用不了?
明明我在控制台下通过 pip 安装后显示 successful 安装成功,但在代码里 import,就报错说 module not found,模块不存在?
Crossin先生
2020/01/17
1.4K0
命令模式(Command)
命令模式(Command) 命令模式(Command)[Action/Transaction] 意图:将一个请求封装为一个对象,从而可用不同的请求对客户参数化。对请求排队或记录请求日志,以及支持可撤消
Florian
2018/02/05
4200
命令模式(Command)
-bash: yum: command not found 错误
卸载:rpm -aq|grep yum|xargs rpm -e --nodeps
OwenZhang
2021/12/08
3.9K0
错误:该行已经属于另一个表
从一个TABLE中取一行放到另一个TABLE里报错: 该行已经属于另一个表。的解决办法 用下面来个方法就OK了。 DataTable dt = new DataTable(); dt = ds.Tables["All"].Clone();//克隆All的结构传递给dt DataRow[] dr=this.dataSet31.Tables["Product"].Select("bc=1"); //通过条件得到符合条件的行 for(int i=0;i<dr.Length;i++) { //将数组元素加入表.
hbbliyong
2018/03/05
7930

相似问题

Google游戏Android领导板意外响应代码410

15

蜂房服务响应410消失

14

响应代码410,以jmeter表示

10

IIRF -如何发送410 Gone响应

111

错误410:消失(代码)

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文