+ -
当前位置:首页 → 问答吧 → C#调C++写的DLL的结构体参数问题

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#结构体定义的问题,正确的结构体定义应该是怎么的呢,请高手指点!

作者: jian200801   发布时间: 2011-12-28

正确做法:
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