none
c++結構語法轉c#問題 RRS feed

  • 問題

  • 目前小弟遇到c++轉換c#的小問題 煩請指點一下

    typedef struct _CMD
    {
    		char* date;  				
    		char* time;
    		int DataValue;
    }CMD;
    
    API文件:
    DWORD GetDataR(CMDData* mdData)
    DWORD GetCountR(DWORD *dwRecordNo)

    小弟修改後

       public struct _CMD
            {
               public byte[] date;
               public byte[] time;
               public int DataValue;
             
            }
            _CMD CMD= new _CMD();
    
    API
     [DllImport(@"aaa.dll")] 
            private extern static int GetDataR(ref _CMD test);
    
    使用
    GetDataR(ref CMDData);

    執行

    GetDataR(ref CMDData);

    都會出現

    執行階段發生嚴重錯誤。錯誤的位址為執行緒 0x1be0 上的 0x6c08dd44,錯誤碼為 0xc0000005。這項錯誤可能是 CLR 中的錯誤,或是在使用者程式碼中不安全的部分或無法驗證的部分中的錯誤。這項錯誤的來源一般包括 COM-interop 或 PInvoke 的使用者封送處理錯誤,可能會造成堆疊損毀。

    我知道一定是在再定義

    DWORD GetDataR(CMDData* mdData)
    DWORD GetCountR(DWORD *dwRecordNo)

    時有問題

    有人可以指導一下要怎麼修正嗎

    以及

    CMDData* mdData
    DWORD *dwRecordNo

    該如何轉換使用



    • 已編輯 dodolon 2012年9月4日 上午 11:20
    2012年9月4日 上午 11:19

解答

  • [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct _CMD
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
        public byte[] date;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
        public byte[] time;
        public int DataValue;
    }
    結構改這樣試試
    • 已編輯 sbphsho 2012年9月6日 上午 05:08
    • 已提議為解答 ChenBruceModerator 2012年9月7日 上午 06:01
    • 已標示為解答 dodolon 2012年9月12日 上午 02:03
    2012年9月6日 上午 05:07

所有回覆