100分在线等,C#调用C++函数问题

pjy998 2011-03-09 03:21:18
C++调用如下所示
UCHAR __stdcall PacketACK(_MSG_PARA MSG, UCHAR SendBuf[], WORD * SendLen, char ErrMsg[]);

我尝试过
[DllImport("xxcomm.dll", EntryPoint = "PacketACK")]
private static extern byte packetACK(MsgParaACK pMsg, byte[] sendBuf,ref ushort sendLen, StringBuilder errMsg);

internal sealed class DefineConstants
{
public const short MaxCmdLen = 239;
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct MsgParaACK
{
public byte DevType; //终端类型
public ushort DevID; //终端ID
public byte AlgoType; //算法标识

//[MarshalAs(UnmanagedType.ByValArray, SizeConst = DefineConstants.MaxCmdLen)]
public byte[] Para ; //参数
}
都不成功。
...全文
162 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangchangming 2011-03-09
  • 打赏
  • 举报
回复
提示错误如下:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
说明你参数传递不对!
pjy998 2011-03-09
  • 打赏
  • 举报
回复
由于项目紧,同事帮编译了一个直接用byte[]数组传递的方式,以结构体传递的暂未解决,待高人指点。
pjy998 2011-03-09
  • 打赏
  • 举报
回复
To:lizhibin11
结构体是不定长的,测试了下
当结构体如下时:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct MsgParaACK
{
public byte DevType; //终端类型
public ushort DevID; //终端ID
public byte AlgoType; //算法标识

[MarshalAs(UnmanagedType.ByValArray, SizeConst = DefineConstants.MaxCmdLen)]
public byte[] Para ; //参数
}
提示:
未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配。

当结构体如下时:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct MsgParaACK
{
public byte DevType; //终端类型
public ushort DevID; //终端ID
public byte AlgoType; //算法标识

//[MarshalAs(UnmanagedType.ByValArray, SizeConst = DefineConstants.MaxCmdLen)]
public byte[] Para ; //参数
}
提示:
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
liu513133872 2011-03-09
  • 打赏
  • 举报
回复
以前有做过类似的,不过好像不太一样。不过也做一下,希望对你有帮助
Clinkxxcomm.dll.cs

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct _MSG_PARA
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 13)]
public string DevType; //终端类型
public int DevID; //终端ID
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string strSFZMHM;//算法标识
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
public string para //参数 以前他们这么CHAR para[30]; //考试原因

}
[DllImport("xxcomm.dll")]
public static extern string PacketACK( _MSG_PARA MSG, System.Byte[] SendBuf,ref System.Int16 SendLen, System.String[] ErrMsg)
另外给你一个网址对我帮助很大 http://blog.csdn.net/xqf222/archive/2010/09/11/5877795.aspx
lizhibin11 2011-03-09
  • 打赏
  • 举报
回复
我找到一篇文章,里面有几种处理方式,其中有一种是你注释掉的那句,你看一下能否参考
http://blog.csdn.net/WuOu/archive/2007/10/19/1832805.aspx
云瑀 2011-03-09
  • 打赏
  • 举报
回复
public byte[] Para ;
改用IntPtr?
lizhibin11 2011-03-09
  • 打赏
  • 举报
回复
我猜测问题在这里:结构体中的数组,在c中传的不是首地址,不同于参数中的数组。然而在c#中,结构体中的数组传递的是首地址。你查看一下C#中的结构体变量大小和C中的结构体变量大小是不是不同。
yalan 2011-03-09
  • 打赏
  • 举报
回复
转帖:

尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
当c#调用其它语言封装的dll时候,有可能会出现这个错误。

1、先来看看dll说明文档里面的函数原型说明:

int GetItemNames(char* sName,WORD wItemId);

2、分析发现:char* 是个令人头疼的问题,如果转换成以下c#代码运行时就会出错:

[DllImport("kingvewcliend.dll")]

public static extern int GetItemNames(string sName, int wItemId);

3、正确的转换方法是:

[DllImport("kingvewcliend.dll")]

public static extern int GetItemNames(StringBuilder sName, int wItemId);

4、在主程序中正确的调用是:

StringBuilder regname = new StringBuilder(256);

GetItemNames(regname, i);
yalan 2011-03-09
  • 打赏
  • 举报
回复
没遇到过,不知下面的连接能否解决你的问题


http://topic.csdn.net/u/20080613/17/577db891-3df9-4b18-a3e6-ea46f9b941b3.html
dongjianhua520520 2011-03-09
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
pjy998 2011-03-09
  • 打赏
  • 举报
回复
提示错误如下:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
pjy998 2011-03-09
  • 打赏
  • 举报
回复
现已知后3个参数调用没问题(已通过其它函数验证通过),主要是_MSG_PARM这个结构体的问题。
yalan 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cloudhsu 的回复:]
StringBuilder errMsg
改成string errMsg?
[/Quote]

那个应该没关系吧~~~~~~~~

楼主提示什么错误呢?
云瑀 2011-03-09
  • 打赏
  • 举报
回复
StringBuilder errMsg
改成string errMsg?
pjy998 2011-03-09
  • 打赏
  • 举报
回复
参照上面的连接还是未能解决问题
#define MAX_CMD_LEN 239

typedef struct {
unsigned char DevType; //终端类型
unsigned short int DevID; //终端ID
unsigned char AlgoType; //算法标识
unsigned char para[MAX_CMD_LEN]; //参数
} _MSG_PARA;
extern "C"
{
UCHAR __stdcall PacketACK(_MSG_PARA MSG, UCHAR SendBuf[], WORD * SendLen, char ErrMsg[]);
}

以上是C++调用方法,请问写成C#是怎样?
yalan 2011-03-09
  • 打赏
  • 举报
回复
发个编译好的C++的DLL文件上来吧,让大家一起帮你调试一下看看

110,567

社区成员

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

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

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