C#调用C/C++DLL传递给系统调用的数据区域太小。(异常来自 HRESULT:0x8007007

分类:.Net知识问答| 发布:camnprbubuol| 查看: | 发表时间:2011/9/15

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

365据说看到好文章不转的人,服务器容易宕机
原创文章如转载,请注明:转载自郑州网建-前端开发 http://camnpr.com/
本文链接:http://camnpr.com/net-wiki/431.html