调用第三方C++ DLL的问题

varlj 2015-09-10 04:37:38
调用大华的SDK,碰到个问题,原定义(去掉了几个int类型的参数)

int Login( int handle,Login_Info_t* pLoginInfo);

typedef struct tagLoginInfo
{
char szIp[46];
uint32_t nPort;
char szUsername[64];
char szPassword[64];
}Login_Info_t;


问题应该就出在那个结构体,那几个char[]我试过char[],string,byte[]等,都得不到理想结果,大家看看应该怎么定义?
我现在的定义

[DllImport(dllName, EntryPoint = "DPSDK_Login", CallingConvention = CallingConvention.StdCall)]
public static extern int DPSDK_Login(int dllHandle,ref LoginInfo loginInfo,int timeout=10000);

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct LoginInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 46)]
public string ip;
public int port;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public string username;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public string password;
}
...全文
167 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2015-09-11
  • 打赏
  • 举报
回复
同意13楼 dllimport中字节对齐方式是非常重要的约定
_lee_chong 2015-09-10
  • 打赏
  • 举报
回复
引用 12 楼 varlj 的回复:
[quote=引用 11 楼 shingoscar 的回复:] Pack = 1是什么鬼? 你去掉再试试
成了,我都不知道这参数哪来的,以前文件里复制过来的……想屎的心都有了,一下午了[/quote] 你把pack=1去掉就好了??? 。。。只能说只sdk的封装的渣。。。pack是字节对齐方式,不同的编译器字节对齐不见得会一致,所以一般我们写dll时会和外部交互的结构体定义都会设置为按1字节对齐,不然有未知风险。。。
varlj 2015-09-10
  • 打赏
  • 举报
回复
引用 11 楼 shingoscar 的回复:
Pack = 1是什么鬼? 你去掉再试试
成了,我都不知道这参数哪来的,以前文件里复制过来的……想屎的心都有了,一下午了
Poopaye 2015-09-10
  • 打赏
  • 举报
回复
Pack = 1是什么鬼? 你去掉再试试
wc_ling 2015-09-10
  • 打赏
  • 举报
回复
引用 8 楼 varlj 的回复:
[quote=引用 6 楼 wc_ling 的回复:] 是大华的视频设备吧,初始化登陆参数是吧 http://www.dahuatech.com/support_downdet-200-1094.html 有说明文档,有DEMO,有SDK。。。
是大华的,不过是平台,不是具体的视频设备。官网没有下载的 技术支持那也没.NET的封装[/quote] 平台是什么,是NVR还是DVR?
varlj 2015-09-10
  • 打赏
  • 举报
回复
引用 4 楼 lc316546079 的回复:
[quote=引用 3 楼 varlj 的回复:] [quote=引用 2 楼 lc316546079 的回复:] 用 ByValTStr 是对的,贴出你报的错撒
没报错 所以我认为编译器是认可了这样的类型转换,不过参数没正确传过去吧 DLL返回的结果是操作超时,一般就是IP没设置对之类的造成的,所以猜测没正确的转换参数[/quote] 至少从你发的定义来看如果用ByValTStr是正确的,至于操作超时,建议结合dll方一起调试,如果无法联系dll方的支持,可以自己写个c/c++层来调用sdk,以便看是c#层的问题还是dll层的问题 另外就算你的代码有误,c#与c/c++交互也不一定会报错;[/quote] 是有这想法,自己写包装DLL了,疯掉了
varlj 2015-09-10
  • 打赏
  • 举报
回复
引用 6 楼 wc_ling 的回复:
是大华的视频设备吧,初始化登陆参数是吧 http://www.dahuatech.com/support_downdet-200-1094.html 有说明文档,有DEMO,有SDK。。。
是大华的,不过是平台,不是具体的视频设备。官网没有下载的 技术支持那也没.NET的封装
varlj 2015-09-10
  • 打赏
  • 举报
回复
引用 5 楼 dongxinxi 的回复:
改成public byte[]username;试试
也试过了,不行,不报错,只超时
wc_ling 2015-09-10
  • 打赏
  • 举报
回复
是大华的视频设备吧,初始化登陆参数是吧 http://www.dahuatech.com/support_downdet-200-1094.html 有说明文档,有DEMO,有SDK。。。
  • 打赏
  • 举报
回复
改成public byte[]username;试试
_lee_chong 2015-09-10
  • 打赏
  • 举报
回复
引用 3 楼 varlj 的回复:
[quote=引用 2 楼 lc316546079 的回复:] 用 ByValTStr 是对的,贴出你报的错撒
没报错 所以我认为编译器是认可了这样的类型转换,不过参数没正确传过去吧 DLL返回的结果是操作超时,一般就是IP没设置对之类的造成的,所以猜测没正确的转换参数[/quote] 至少从你发的定义来看如果用ByValTStr是正确的,至于操作超时,建议结合dll方一起调试,如果无法联系dll方的支持,可以自己写个c/c++层来调用sdk,以便看是c#层的问题还是dll层的问题 另外就算你的代码有误,c#与c/c++交互也不一定会报错;
varlj 2015-09-10
  • 打赏
  • 举报
回复
引用 2 楼 lc316546079 的回复:
用 ByValTStr 是对的,贴出你报的错撒
没报错 所以我认为编译器是认可了这样的类型转换,不过参数没正确传过去吧 DLL返回的结果是操作超时,一般就是IP没设置对之类的造成的,所以猜测没正确的转换参数
_lee_chong 2015-09-10
  • 打赏
  • 举报
回复
用 ByValTStr 是对的,贴出你报的错撒
varlj 2015-09-10
  • 打赏
  • 举报
回复
也试过UnmanagedType.ByValTStr

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧