傳遞給系統調用的數據區域太小。 (異常來自 HRESULT:0x8007007A)


在做結構體向字節數組轉換的時候,常遇到"傳遞給系統調用的數據區域太小"的錯誤,究其原因是因為英文與漢字的編碼方式不同,一個漢字等於兩個字節,而一個英文字母等於1個字節。所以,對於如下的結構體:

/// <summary>
    /// 報警協議數據區結構
    /// </summary>
    [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct DataAreaForAlarmAsk
    {
        /// char[20]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 20)]
        public char[] szAlarmNo;
 
        /// char[10]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 10)]
        public char[] szUserNo;
 
        /// char[100]
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 100)]
        public string szUserName;

。。。}
  對於szUserName,用戶姓名,在國內的系統中,極可能就含有中文字母,那么我們獲取時,務必將字符串長度折半,即50,具體如下
//用戶名稱
                alarmProtoAlarmAsk.dataAreaForAsk.szUserName = (alarm_user_name.Length < 50) ? alarm_user_name : alarm_user_name.Substring(0, 50);
				


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM