这是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
public byte[] sMultiCastIP;//保留
----〉
这个参数转为intptr
#2
还有那个long改为int
#3
还是一样的错误
#4
还是一样的错误啊
#5
lRealHandle = HbSDK.HB_SDVR_RealPlay(userid,0, kl);
把这里的KL转换下行不行呢?
Marshal.StructureToPtr
把这里的KL转换下行不行呢?
Marshal.StructureToPtr
#6
C++DLL中 函数第三个参数是结构体指针,而调用时第三个参数是一个调用方的结构体,函数参数不同啊。。
第三个参数改为Intptr,先new结构体,使用结构体到指针的转换。
调用方使用的结构体应该是dll中定义的吧,不能自定义吧,虽然名字相同。
第三个参数改为Intptr,先new结构体,使用结构体到指针的转换。
调用方使用的结构体应该是dll中定义的吧,不能自定义吧,虽然名字相同。
#7
不行,不过已经解决了,把框架改成2.0就成了
#8
已经解决了,把框架改成2.0就成了
#1
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] sMultiCastIP;//保留
----〉
这个参数转为intptr
public byte[] sMultiCastIP;//保留
----〉
这个参数转为intptr
#2
还有那个long改为int
#3
还是一样的错误
#4
还是一样的错误啊
#5
lRealHandle = HbSDK.HB_SDVR_RealPlay(userid,0, kl);
把这里的KL转换下行不行呢?
Marshal.StructureToPtr
把这里的KL转换下行不行呢?
Marshal.StructureToPtr
#6
C++DLL中 函数第三个参数是结构体指针,而调用时第三个参数是一个调用方的结构体,函数参数不同啊。。
第三个参数改为Intptr,先new结构体,使用结构体到指针的转换。
调用方使用的结构体应该是dll中定义的吧,不能自定义吧,虽然名字相同。
第三个参数改为Intptr,先new结构体,使用结构体到指针的转换。
调用方使用的结构体应该是dll中定义的吧,不能自定义吧,虽然名字相同。
#7
不行,不过已经解决了,把框架改成2.0就成了
#8
已经解决了,把框架改成2.0就成了