C#调用C++DLL问题,全分投入求大侠指点

时间:2021-11-19 10:42:06
C++原来的
BOOL NET_DVR_PlayBackControl_V40(
  LONG     lPlayHandle,
  DWORD    dwControlCode,
  char     *lpInBuffer
  DWORD    dwInLen,
  char     *lpOutBuffer,
  DWORD    *lpOutLen
);

C#转化的
[DllImport("HCNetSDK.dll")]        
public static extern bool NET_DVR_PlayBackControl_V40(int lPlayHandle, uint dwControlCode, string dwInValue, uint dwInvalue_len, StringBuilder LPOutValue, ref uint LPOutValue_len); 

C#调用的
StringBuilder uCurTime = new StringBuilder();
uint uCuiTime_len = 0;
HCNetSDK.NET_DVR_PlayBackControl_V40(iPlayHandle, HCNetSDK.NET_DVR_PLAYGETTIME, null, 0, uCurTime, ref uCuiTime_len);

19 个解决方案

#1


报错了?

#2


C#转化的
[DllImport("HCNetSDK.dll")]   
public static extern bool NET_DVR_PlayBackControl_V40(int lPlayHandle, uint dwControlCode, Intptr dwInValue, uint dwInvalue_len, Intptr LPOutValue, ref uint LPOutValue_len);  

C#调用的
uint uCuiTime_len = 0;
HCNetSDK.NET_DVR_PlayBackControl_V40(iPlayHandle, HCNetSDK.NET_DVR_PLAYGETTIME, Intptr.Zero, 0, Intptr.Zero, ref uCuiTime_len);

#3


应该是参数对应错误了 char* 转换有问题

#4


引用 2 楼  的回复:
C#转化的
[DllImport("HCNetSDK.dll")]   
public static extern bool NET_DVR_PlayBackControl_V40(int lPlayHandle, uint dwControlCode, Intptr dwInValue, uint dwInvalue_len, Intptr LPOutValue, ref uint LPO……


我试验了这个,将Intptr.Zero改为uCurTime   提前定义了IntPtr uCurTime = new IntPtr();
得到返回值一直是0,这个应该是从0开始逐步变大的

#5


这个函数的意思是,获取当前播放文件的播放时间,我已经获得了该文件的总时间,现在想要获取播放时间,用了timer空间,在tick事件中,更新这个获取的当前时间

#6


引用 1 楼  的回复:
报错了?


不报告错误,就是获取的值不是我要的值

#7



/// Return Type: BOOL->int
    ///lPlayHandle: LONG->int
    ///dwControlCode: DWORD->unsigned int
    ///lpInBuffer: char*
    ///dwInLen: DWORD->unsigned int
    ///lpOutBuffer: char*
    ///lpOutLen: DWORD*
    [System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="NET_DVR_PlayBackControl_V40")]
    [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern  bool NET_DVR_PlayBackControl_V40(int lPlayHandle, uint dwControlCode, System.IntPtr lpInBuffer, uint dwInLen, System.IntPtr lpOutBuffer, ref uint lpOutLen) ;

#8


有个小工具可以帮助生成C#代码

叫做 winsiggen

#9


主要是我转化的函数对不对?
返回的值是什么 ?是 对应的内存的指针?还是什么 ?
如果是对应内存的指针,如何将数据提取出来呢 ?我需要的是一个uint的值

#10


引用 8 楼  的回复:
有个小工具可以帮助生成C#代码

叫做 winsiggen

在CSDN资源里面下载了1个,解压缩错误,不能用啊

#11


引用 8 楼  的回复:
有个小工具可以帮助生成C#代码

叫做 winsiggen


下载下来了,英文版的,怎么用呀?有说明书么?QQ 261108689帮忙下,谢谢

#12


应该是参数类型转化错了
传入的char*用string 传出的用StringBuilder 

#13


引用 12 楼  的回复:
应该是参数类型转化错了
传入的char*用string 传出的用StringBuilder


这个实验过了,输出的是乱码

#14


引用 11 楼  的回复:
引用 8 楼  的回复:

有个小工具可以帮助生成C#代码

叫做 winsiggen


下载下来了,英文版的,怎么用呀?有说明书么?QQ 261108689帮忙下,谢谢


切换到 SigImp Translate Snippet 页

选择Language 为 CSharp

在 Native Code Snippet 中粘贴C++代码

点 Generate 后在右边框就会生成 C#代码

#15


试验了所有的方法,能返回值了,但是都不是我要的,没办法了,现在在播放进度条下面改成进度了,获取播放位置函数好用,也不知道是怎么回事
试验了直接返回uin、返回string、返回stringbuiler、返回指针再从内存读数据,都不行~愁死了

#16


引用 15 楼  的回复:
试验了所有的方法,能返回值了,但是都不是我要的,没办法了,现在在播放进度条下面改成进度了,获取播放位置函数好用,也不知道是怎么回事
试验了直接返回uin、返回string、返回stringbuiler、返回指针再从内存读数据,都不行~愁死了

他返回的应该是当前帧数之类的东西吧,例如你总文件大小是100 ,他返回的 ref uint LPOutValue_len 是1,2,3,4这样的?不是?

#17


不同的函数返回的不一样,用老的80系列的DVR可以实现 返回总帧数、总时间、播放帧数、播放时间、播放位置等等
但是用新的硬盘录像机,只能返回总时间、总帧数、播放位置
播放时间返回的值是好几万的uint值,肯定不正确,因为总时间才 几千。。。
所以我换了新的SDK函数,但是返回的值没有合适的。

返回的播放时间值,应该是从1开始,逐渐变大,直到等于总时间。。。。

怎么回事呢?

#18


他返回的值没有变化?

#19


是的,每次返回的值都一样,而且不是我要的值

#1


报错了?

#2


C#转化的
[DllImport("HCNetSDK.dll")]   
public static extern bool NET_DVR_PlayBackControl_V40(int lPlayHandle, uint dwControlCode, Intptr dwInValue, uint dwInvalue_len, Intptr LPOutValue, ref uint LPOutValue_len);  

C#调用的
uint uCuiTime_len = 0;
HCNetSDK.NET_DVR_PlayBackControl_V40(iPlayHandle, HCNetSDK.NET_DVR_PLAYGETTIME, Intptr.Zero, 0, Intptr.Zero, ref uCuiTime_len);

#3


应该是参数对应错误了 char* 转换有问题

#4


引用 2 楼  的回复:
C#转化的
[DllImport("HCNetSDK.dll")]   
public static extern bool NET_DVR_PlayBackControl_V40(int lPlayHandle, uint dwControlCode, Intptr dwInValue, uint dwInvalue_len, Intptr LPOutValue, ref uint LPO……


我试验了这个,将Intptr.Zero改为uCurTime   提前定义了IntPtr uCurTime = new IntPtr();
得到返回值一直是0,这个应该是从0开始逐步变大的

#5


这个函数的意思是,获取当前播放文件的播放时间,我已经获得了该文件的总时间,现在想要获取播放时间,用了timer空间,在tick事件中,更新这个获取的当前时间

#6


引用 1 楼  的回复:
报错了?


不报告错误,就是获取的值不是我要的值

#7



/// Return Type: BOOL->int
    ///lPlayHandle: LONG->int
    ///dwControlCode: DWORD->unsigned int
    ///lpInBuffer: char*
    ///dwInLen: DWORD->unsigned int
    ///lpOutBuffer: char*
    ///lpOutLen: DWORD*
    [System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="NET_DVR_PlayBackControl_V40")]
    [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern  bool NET_DVR_PlayBackControl_V40(int lPlayHandle, uint dwControlCode, System.IntPtr lpInBuffer, uint dwInLen, System.IntPtr lpOutBuffer, ref uint lpOutLen) ;

#8


有个小工具可以帮助生成C#代码

叫做 winsiggen

#9


主要是我转化的函数对不对?
返回的值是什么 ?是 对应的内存的指针?还是什么 ?
如果是对应内存的指针,如何将数据提取出来呢 ?我需要的是一个uint的值

#10


引用 8 楼  的回复:
有个小工具可以帮助生成C#代码

叫做 winsiggen

在CSDN资源里面下载了1个,解压缩错误,不能用啊

#11


引用 8 楼  的回复:
有个小工具可以帮助生成C#代码

叫做 winsiggen


下载下来了,英文版的,怎么用呀?有说明书么?QQ 261108689帮忙下,谢谢

#12


应该是参数类型转化错了
传入的char*用string 传出的用StringBuilder 

#13


引用 12 楼  的回复:
应该是参数类型转化错了
传入的char*用string 传出的用StringBuilder


这个实验过了,输出的是乱码

#14


引用 11 楼  的回复:
引用 8 楼  的回复:

有个小工具可以帮助生成C#代码

叫做 winsiggen


下载下来了,英文版的,怎么用呀?有说明书么?QQ 261108689帮忙下,谢谢


切换到 SigImp Translate Snippet 页

选择Language 为 CSharp

在 Native Code Snippet 中粘贴C++代码

点 Generate 后在右边框就会生成 C#代码

#15


试验了所有的方法,能返回值了,但是都不是我要的,没办法了,现在在播放进度条下面改成进度了,获取播放位置函数好用,也不知道是怎么回事
试验了直接返回uin、返回string、返回stringbuiler、返回指针再从内存读数据,都不行~愁死了

#16


引用 15 楼  的回复:
试验了所有的方法,能返回值了,但是都不是我要的,没办法了,现在在播放进度条下面改成进度了,获取播放位置函数好用,也不知道是怎么回事
试验了直接返回uin、返回string、返回stringbuiler、返回指针再从内存读数据,都不行~愁死了

他返回的应该是当前帧数之类的东西吧,例如你总文件大小是100 ,他返回的 ref uint LPOutValue_len 是1,2,3,4这样的?不是?

#17


不同的函数返回的不一样,用老的80系列的DVR可以实现 返回总帧数、总时间、播放帧数、播放时间、播放位置等等
但是用新的硬盘录像机,只能返回总时间、总帧数、播放位置
播放时间返回的值是好几万的uint值,肯定不正确,因为总时间才 几千。。。
所以我换了新的SDK函数,但是返回的值没有合适的。

返回的播放时间值,应该是从1开始,逐渐变大,直到等于总时间。。。。

怎么回事呢?

#18


他返回的值没有变化?

#19


是的,每次返回的值都一样,而且不是我要的值

#20