2011-10-12 30 views
0

我花了1天的時間來找出這個問題發生的原因,但結果仍然失敗。 當我在本機DLL中調試時,它顯示第二個參數的錯誤指針。需要這裏的專家來建議在我的步驟中缺少產生此錯誤的內容。PInvoke編組結構和BYTE *作爲參數導致壞指針

  • 母語STRUCT
typedef struct 
     { 
      BYTE bcdTicketMainType; 
      BYTE bcdTicketSubType; 
      BYTE bcdValidityStartDate[4];  // YYYYMMDD 
      BYTE bcdValidityEndDate[4];  // YYYYMMDD 
      BYTE bcdPhysicalExpiryDate[4];  // YYYYMMDD 
      BYTE bFareZone; 
      SHORT sDepositAmount;    // NEW ARGUMENT 
      LONG lBalance;      // NEW ARGUMENT 
      BYTE bcdStationIDOrigin[2]; 
      BYTE bcdStationIDDestination[2]; 
      BYTE bcdPaymentType; 
      CHAR strPaymentMediaID[20]; 
      CHAR strAgentID[8]; 
      BYTE bcdShiftID; 
     } T_TK_KTMB_CSC_SALE_INFO; 
  • 結構在C#
public struct T_TK_KTMB_CSC_SALE_INFO 
    { 
     public byte bcdTicketMainType; // 1 
     public byte bcdTicketSubType; // 1 
     [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)] 
     public byte[] bcdValidityStartDate;  // YYYYMMDD 
     [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)] 
     public byte[] bcdValidityEndDate;  // YYYYMMDD 
     [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)] 
     public byte[] bcdPhysicalExpiryDate;  // YYYYMMDD 
     public byte bFareZone; 
     public short sDepositAmount;    // NEW ARGUMENT 
     public long lBalance;      // NEW ARGUMENT 
     [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2)] 
     public byte[] bcdStationIDOrigin; 
     [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2)] 
     public byte[] bcdStationIDDestination; 
     public byte bcdPaymentType; 
     [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 20)] 
     public char[] szPaymentMediaID; 
     [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 8)] 
     public char[] szAgentID; 
     public byte bcdShiftID; 
    } 
  • 固有函數

INT KTMBBiz_CSCSale(T_TK_KTMB_CSC_SALE_INFO CSCSaleInfo,BYTE * pbTranxData);

  • 在C#

    [的DllImport( 「KTMBBizRule.dll」)] 公共靜態外部INT KTMBBiz_CSTSale([IN,OUT的MarshalAs(UnmanagedType.LPArray,SizeParamIndex => 127功能)] byte [] pbTranxData,T_TK_KTMB_CST_SALE_INFO CSTSaleInfo);稱爲在C#

  • 功能

private void btnCscSale_Click(object sender, EventArgs e) 
    { 
     T_TK_KTMB_CSC_SALE_INFO cscSale = new T_TK_KTMB_CSC_SALE_INFO(); 
     byte[] trxData = new byte[2]; 
     BizRule.KTMBBiz_CSCSale(cscSale, trxData); 
    } 
  • 錯誤創建於本機C++

enter image description here

+0

您的C#函數聲明有兩個參數交換。 –

回答

0

SizeParamIndex屬性表示第n個函數參數(從零開始,從左數起)包含數組的實際大小。 您的函數只有2個參數,而不是127.

更重要的是,您在C++和C#中交換了pbTranxDataCSTSaleInfo參數。

可以使用SizeParamIndex讓C++函數知道pbTranxData數組的大小:

C++

int KTMBBiz_CSCSale(T_TK_KTMB_CSC_SALE_INFO CSCSaleInfo, 
        BYTE* pbTranxData, INT iLength); 

C#

[DllImport("KTMBBizRule.dll")] 
public static extern int KTMBBiz_CSTSale(
     T_TK_KTMB_CST_SALE_INFO CSTSaleInfo, 
     [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=2)] 
     byte[] pbTranxData, 
     int iLength); 

現在KTMBBiz_CSTSale(cscSale, trxData, trxData.Length);

叫什麼你還應該加[StructLayout(LayoutKind.Sequential)]之前你的C#結構。

而不是public char[] szPaymentMediaID;你可以說string szPaymentMediaID。 默認情況下,字符串編組爲char *,您可以使用給定的SizeConst將其更改爲UnmanagedType.ByValTStr