C# 调用C++DLL出问题了

时间:2022-06-06 12:50:52

这是C++原始函数和结构体
LONG HB_SDVR_RealPlay(
  LONG  lUserID,
  LONG   lWindows,
   LPHB_SDVR_CLIENTINFO  lpClientInfo
); 
typedef struct {
  LONG  lChannel;
  LONG  lLinkMode;
  HWND  hPlayWnd;
  char  *sMultiCastIP;
} HB_SDVR_CLIENTINFO,  *LPHB_SDVR_CLIENTINFO;



这是我转换的结构体和函数
 //    预览参数结构体。
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct LPHB_SDVR_CLIENTINFO
        {
            public long lChannel;//通道口号
            public long lLinkMode;//  最高位(31)为0表示主码流,为1表示子码流;0-30位表示码流连接方式: 0-TCP方式,1-UDP方式,2-多播方式。
            public IntPtr hPlayWnd;//播放句柄
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] sMultiCastIP;//保留
        }


  [DllImport(@"7000sdk.dll")]
        public static extern long HB_SDVR_RealPlay(long lUserID, long lWindows, LPHB_SDVR_CLIENTINFO lpClientInfo);


这是调用 
  HbSDK.LPHB_SDVR_CLIENTINFO kl = new HbSDK.LPHB_SDVR_CLIENTINFO();
            kl.lChannel = 0;
            kl.lLinkMode = 0;
            lRealHandle = HbSDK.HB_SDVR_RealPlay(userid,0,  kl);
            MessageBox.Show(lRealHandle.ToString());


总是出错异常  对 PInvoke 函数“HBGKDemo!HBGKDemo.HbSDK::HB_SDVR_RealPlay”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。


怎么回事求大神指导???

8 个解决方案

#1


[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] sMultiCastIP;//保留
----〉
这个参数转为intptr

#2


还有那个long改为int

#3


引用 2 楼 hdt 的回复:
还有那个long改为int
 还是一样的错误

#4


引用 1 楼 hdt 的回复:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] sMultiCastIP;//保留
----〉
这个参数转为intptr
   还是一样的错误啊 C# 调用C++DLL出问题了

#5


lRealHandle = HbSDK.HB_SDVR_RealPlay(userid,0,  kl);
把这里的KL转换下行不行呢?
Marshal.StructureToPtr

#6


C++DLL中 函数第三个参数是结构体指针,而调用时第三个参数是一个调用方的结构体,函数参数不同啊。。
第三个参数改为Intptr,先new结构体,使用结构体到指针的转换。
调用方使用的结构体应该是dll中定义的吧,不能自定义吧,虽然名字相同。

#7


引用 5 楼 xingeddx 的回复:
lRealHandle = HbSDK.HB_SDVR_RealPlay(userid,0,  kl);
把这里的KL转换下行不行呢?
Marshal.StructureToPtr
 不行,不过已经解决了,把框架改成2.0就成了

#8


引用 6 楼 lulu23260 的回复:
C++DLL中 函数第三个参数是结构体指针,而调用时第三个参数是一个调用方的结构体,函数参数不同啊。。
第三个参数改为Intptr,先new结构体,使用结构体到指针的转换。
调用方使用的结构体应该是dll中定义的吧,不能自定义吧,虽然名字相同。
已经解决了,把框架改成2.0就成了

#1


[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] sMultiCastIP;//保留
----〉
这个参数转为intptr

#2


还有那个long改为int

#3


引用 2 楼 hdt 的回复:
还有那个long改为int
 还是一样的错误

#4


引用 1 楼 hdt 的回复:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] sMultiCastIP;//保留
----〉
这个参数转为intptr
   还是一样的错误啊 C# 调用C++DLL出问题了

#5


lRealHandle = HbSDK.HB_SDVR_RealPlay(userid,0,  kl);
把这里的KL转换下行不行呢?
Marshal.StructureToPtr

#6


C++DLL中 函数第三个参数是结构体指针,而调用时第三个参数是一个调用方的结构体,函数参数不同啊。。
第三个参数改为Intptr,先new结构体,使用结构体到指针的转换。
调用方使用的结构体应该是dll中定义的吧,不能自定义吧,虽然名字相同。

#7


引用 5 楼 xingeddx 的回复:
lRealHandle = HbSDK.HB_SDVR_RealPlay(userid,0,  kl);
把这里的KL转换下行不行呢?
Marshal.StructureToPtr
 不行,不过已经解决了,把框架改成2.0就成了

#8


引用 6 楼 lulu23260 的回复:
C++DLL中 函数第三个参数是结构体指针,而调用时第三个参数是一个调用方的结构体,函数参数不同啊。。
第三个参数改为Intptr,先new结构体,使用结构体到指针的转换。
调用方使用的结构体应该是dll中定义的吧,不能自定义吧,虽然名字相同。
已经解决了,把框架改成2.0就成了