C#调用 C DLL文件是报这个错:
汉字: 传递给系统调用的数据区域太小。 (异常来自 HRESULT:0x8007007A)
其他类型(数字、字母)的不报错,一切正常!
就是汉字报此错!!
找到问题了;
问题在于:结构声明
调用 DLL 时,声明结构一定要注意,如果参数中有"字符串”传进来,或输出的话;
一定要使用 Unicode 而不能采用 Ansi
正确 :
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
修正后代码例子:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
//[StructLayout(LayoutKind.Sequential)]
public struct CAM_GROUP_INFO
{
public int nCamGroupID; //camera group id
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] szGroupName; //camera group name
public int nServerID; //belong to which server
public int state; //MP_CAM_StateXXXX
};
如果我用CharSet = CharSet.Unicode在c#中像上面这样申明结构体,则释放不会出错,但是获取CCameraMngr_RetrieveCamGroupListFromServer这个函数 得到的结构体的数据就不对,里面只有nCamGroupID是正确的 其他都是0,字符类型的是乱码,如果改成ansi申明结构体,则得到数据都是正确的,但释放那个函数会报 “传递给系统调用的数据区域太小。 (异常来自 HRESULT:0x8007007A) ”错误
最终解决办法是:public char[] szGroupName; //camera group name
此句的 char[] 最好改成 byte[] .如果还不行,要检查一下DLL的编译的字符集是ascii吗?还不行,再加此句:[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 。一定要和做DLL的人协商解决。祝你好运!。
转载此文,请注明:郑州网建-上海网建 http://www.camnpr.com