none
C#中Byte array參數輸入dll內部的struct匹配問題 RRS feed

  • 問題

  • 大家好:

    小弟有一個問題想要請問大家,懇請大家給予寶貴的意見,先謝謝大家!我現在撰寫一個C#程式,其中有一個部分會使用到用C寫的外部DLL檔,DLL內部定義如下:

    mydll.h

    #ifdef mydll
      #define mydll extern "C" _declspec(dllexport)
      #else
      #define mydll extern "C" _declspec(dllimport)
      #endif

    mydll bool _stdcall parselogmsg(unsigned char *buff);

     

    typedef _int64                    qword;

    typedef  unsigned char      boolean;       /* Boolean value type. */

    typedef  unsigned long int  uint32;          /* Unsigned 32 bit value */
      typedef  unsigned short     uint16;          /* Unsigned 16 bit value */
      typedef  unsigned char      uint8;            /* Unsigned 8  bit value */

    typedef  signed long int    int32;            /* Signed 32 bit value */
      typedef  signed short       int16;             /* Signed 16 bit value */
      typedef  signed char        int8;               /* Signed 8  bit value */

    typedef  unsigned char     byte;            /* Unsigned 8  bit value type. */
      typedef  unsigned short    word;           /* Unsinged 16 bit value type. */
      typedef  unsigned long     dword;         /* Unsigned 32 bit value type. */

     

    typedef struct
      {
        uint16 len;                       
        uint16 code;
        qword ts;
      }log_hdr_type;

     

    typedef struct
     {
       union
       {
             int        a;

          char     b;

          int         c;

          int         d;

      }u;
     }log_body_type;

     

    typedef struct                        

    {
        uint8               cmd_code;
        uint8               more;          
        uint16             length;                        
        log_hdr_type    log_hdr;
        log_body_type log_body;
     }any_cht_log_rsp_type;

     

    mydll.cpp

    #include<windows.h>

    #define mydll extern "C" _declspec(dllexport)

    #include "dll.h"

    #include "string.h"


      bool parselogmsg(unsigned char *buf)
      {
          any_cht_log_rsp_type *cht_log_rsp = (any_cht_log_rsp_type *)buf;


          printf("len %x\n",cht_log_rsp->log_hdr.len);
          printf("code %x\n",cht_log_rsp->log_hdr.code);
          printf("ts %x\n",cht_log_rsp->log_hdr.ts);

     

    return true;

    }

     

     

    而我在C#上是這樣寫的:

     

    //Import dm_dll APIs declaration
            [DllImport("dll.dll", EntryPoint = "parselogmsg")]
            public static extern bool ParseLogMsg(byte[] buf);

     

          byte[] RxBuff = new byte[512];

     

          ParseLogMsg(RxBuff);

     

     

    RxBuff的值為10 00 24 00 24 00 01 C0 4A A8 C4 D7 92 D0 B1 01 14 7E 

    我期望將RxBuff(byte array)的值丟進mydll處理後後,可以得到

    cht_log_rsp->log_hdr.len =   0024

    cht_log_rsp->log_hdr.code = C001

    cht_log_rsp->log_hdr.ts = D7C4A84A

     

    可是我得到的結果卻是如下

    cht_log_rsp->log_hdr.len =   A84A

    cht_log_rsp->log_hdr.code = D7C4

    cht_log_rsp->log_hdr.ts = 01B1D092

     

    我怎麼試都試不出我想要的結果,能否請大家幫我看看到底是哪兒出錯了?感謝!
    2007年5月16日 上午 03:56

解答

  • 大家好:

     

                 小弟已經找到答案了,原來是Structure Alignment的問題,經過設定後已可以解決問題,謝謝大家!

    2007年5月16日 下午 02:21