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


背景:

在C#代碼中,需要將一個結構體轉為字符數組的形式

結構的形式類似於:

struct usrInfo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public char[] name;
    public int ID;
}

 

調用自己的結構體轉換函數,將其轉為字符數組形式

但是提示如下錯誤:傳遞給系統調用的數據區域太小。 (異常來自 HRESULT:0x8007007A)

這里你首先就要檢查你給name賦值是不是超過了16的大小?然后再往下看!

錯誤提示在:Marshal.StructureToPtr(structObj, structPtr, true); 方法處

查錯:

在網上找了一些材料,發現也有一些類似的情況。有一個狀況是:轉換英文的時候不會出錯,但轉換中文會出錯。

測試了一下,果真是這樣的。因為程序需要使用中文名,而是用英文的時候沒有出現該錯誤提示。

錯誤原因:

在結構體布局的時候,沒有指明是unicode碼方式,因此在將結構體傳送到StructToPtr()方法的時候產生了錯誤

解決辦法:

用StructLayOut特性來定義結構體,使其編碼方式采用unicode編碼方式(通過設置CharSet屬性來實現)

修改后結構體定義如下:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
struct usrInfo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public char[] name;
    public int ID;
}

 


免責聲明!

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



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