C#调C++写的DLL的结构体参数问题
时间:2011-12-28
来源:互联网
C#调C++写的DLL里的一个函数
原型是:
_DLLIMP long CALL_CONVENT VLVmcConnectVoc(
long VmcHandle,
const PVOCLINK_PARAM pVocSrv,
long* pVocHandle
);
其中结构体 VOCLINK_PARAM 的定义是
typedef struct _VOCLINK_PARAM{
TCHAR sVocIp[16];
UINT nPort;
}VOCLINK_PARAM,*PVOCLINK_PARAM;
我在C#里定义了结构体 VoiceLinkParam
[StructLayout(LayoutKind.Sequential)]
struct VoiceLinkParam
{
public byte[] voiceip;
public uint port;
}
调用如下:
VoiceLinkParam voice_link_param = new VoiceLinkParam();
string voiceip = "192.168.4.44";
voice_link_param.port = 3000;
int voc_handle = 0;
int voc_connect_result = ClassVMC.VLVmcConnectVoc(vmc_handle,ref voice_link_param, ref voc_handle);
if (voc_connect_result == VMC_ERR_SUCCESS)
{
MessageBox.Show("Connect Voice Success.");
}
else
{
MessageBox.Show("Connect Voice fail.Result=" + voc_connect_result);
}
class ClassVMC
{
[DllImport("VLVmc.dll", EntryPoint = "VLVmcConnectVoc")]
public static extern int VLVmcConnectVoc(int vmc_handle,ref VoiceLinkParam voc_param, ref int voc_handle);
}
可是程序在红色处报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏;
估计是C#结构体定义的问题,正确的结构体定义应该是怎么的呢,请高手指点!
原型是:
_DLLIMP long CALL_CONVENT VLVmcConnectVoc(
long VmcHandle,
const PVOCLINK_PARAM pVocSrv,
long* pVocHandle
);
其中结构体 VOCLINK_PARAM 的定义是
typedef struct _VOCLINK_PARAM{
TCHAR sVocIp[16];
UINT nPort;
}VOCLINK_PARAM,*PVOCLINK_PARAM;
我在C#里定义了结构体 VoiceLinkParam
[StructLayout(LayoutKind.Sequential)]
struct VoiceLinkParam
{
public byte[] voiceip;
public uint port;
}
调用如下:
VoiceLinkParam voice_link_param = new VoiceLinkParam();
string voiceip = "192.168.4.44";
voice_link_param.port = 3000;
int voc_handle = 0;
int voc_connect_result = ClassVMC.VLVmcConnectVoc(vmc_handle,ref voice_link_param, ref voc_handle);
if (voc_connect_result == VMC_ERR_SUCCESS)
{
MessageBox.Show("Connect Voice Success.");
}
else
{
MessageBox.Show("Connect Voice fail.Result=" + voc_connect_result);
}
class ClassVMC
{
[DllImport("VLVmc.dll", EntryPoint = "VLVmcConnectVoc")]
public static extern int VLVmcConnectVoc(int vmc_handle,ref VoiceLinkParam voc_param, ref int voc_handle);
}
可是程序在红色处报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏;
估计是C#结构体定义的问题,正确的结构体定义应该是怎么的呢,请高手指点!
作者: jian200801 发布时间: 2011-12-28
正确做法:
C# code
C# code
[StructLayout(LayoutKind.Sequential)] public struct VoiceLinkParam { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string voiceip; public uint port; }
作者: sdl2005lyx 发布时间: 2011-12-28
你顶了我的帖子么 我也来顶顶你的 呵呵
作者: tcwushaofei 发布时间: 2011-12-28
奇怪,看不到回复呀,csdn 有bug吗
作者: jian200801 发布时间: 2011-12-28
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28