前言
关键字:c++ to C#
原计划是再写一篇H264播放器转换AVI的文章才开始写总结的,至今未能成功,由于时间问题并且也暂时没有这个需求,所以决定从原计划中去掉这一章节直接进入总结贴,然后结束这个系列文章。如果公司这边不出什么意外,可能稍候1-2月会把后续的功能作为本系列的续集来分享给大家,请谅解!
注意
本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心、实现以及其他能够贴出来的代码我都会贴出来,并且争取尽所能的回答留言里的每一个问题,感谢大家关注,欢迎交流 :)
系列
5. C# 视频监控系列(5):客户端——给服务器端发送字符串和录像(数据捕获)
6. C# 视频监控系列(6):服务器端——封装API(上) [HikServer.dll]
7. C# 视频监控系列(7):服务器端——封装API(下) [DS40xxSDK.dll]
8. C# 视频监控系列(8):服务器端——预览和可被客户端连接
9. C# 视频监控系列(9):服务器端——数据捕获(抓图 + 录像)
10. C# 视频监控系列(10):服务器端——验证、设置画面质量、字幕叠加、板卡序列号
11. C# 视频监控系列(11):H264播放器——封装API[HikPlayM4.dll]
12. C# 视频监控系列(12):H264播放器——播放录像文件
13. C# 视频监控系列(13):H264播放器——控制播放和截图
14. C# 视频监控系列(14):总结贴——VC++代码转成C#小结
正文
1. 使用Marshal.AllocHGlobal(使用 GlobalAlloc 从进程的非托管内存中分配内存)创建IntPtr,用完之后记得用Marshal.FreeHGlobal释放内存,否则如此该方法处在在一个无限循环中将不断分配内存,直至内存耗尽。
2. 数据类型
2.1 结构体传输一般都会加上ref
VC++:
int __stdcall StartVideoPreview(HANDLE hChannelHandle,HWND WndHandle, RECT *rect,BOOLEAN bOverlay, int VideoFormat, int FrameRate)
C#:
public static extern int StartVideoPreview(IntPtr hChannelHandle, IntPtr WndHandle,ref Rectangle rect, bool bOverlay, int VideoFormat, int FrameRate);
注:RECT和Rectangle均为结构体
2.2 指针类型
VC++: HWND、HANDLE
C#: IntPtr 一般是取控件窗体的句柄 Panel.Handle
2.2 颜色
VC++: COLORREF
C#: int Color.FromA#ff00ff.ToArgb()
2.3 传出参数
VC++: int*/ULONG */DWORD *
C#: out int/out long/out ushort 等
VC++里面的int、long数据类型与C#转换的时候并不严格,只要不超过范围就行,所以有的地方用int也可以、用long也可以。
3. 回调函数一律声明成成员变量
例如:
STREAM_DIRECT_READ_CALLBACK sdrc;
/// <summary>
/// 预览并客户端连接
/// </summary>
private void PreviewAndClientConnect()
{
sdrc = new STREAM_DIRECT_READ_CALLBACK(STREAM_DIRECT_READ_CALLBACK1);
//[必须]注册编码图像数据流直接读取回调函数
HikVisionSDK.RegisterStreamDirectReadCallback(sdrc, this.Handle);
}
4. 调用委托 出错
一般委托出错有三种情况:
4.1 参数类型和api的类型没有对应上,比如他是char*你给对应的是IntPtr,有可能就会出错
4.2 委托没有声明成成员变量,前面已经强调过很多次也给了文章,这里就不复述了。
4.3 可能报错说内存已经被收回之类的,你在委托上叫一个这样的标记:[UnmanagedFunctionPointer(CallingConvention.Cdecl)]。
补充
2010-2-3 P/invoke in .NET Compact Framework
5. 相关文章
结束
可能还有其他地方需要注意的,这需要你自己细心的对比查看和搜索相关资料,仍然要祝你顺顺利利!本帖再后续的工作中会持续更新,请大家留意!