首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 呼叫 Prodave DLL 實戰(二):陣列封送、StringBuilder 用法與枚舉替代整數參數

     編輯:關於C語言

類似佈局,加上 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] 宣告。但最終單純用兩個陣列作為「共用體」欄位可編譯,加上 unsigned char Mpi 則編譯或執行皆失敗。反覆嘗試失敗後,聯想到記憶體中共用體實際用最大欄位大小的記憶體空間,嘗試直接定義 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] byte Mac[6],果然解決共用體問題。C++ 傳入參數實際上也是 6 位元組陣列,既然一個陣列搞定,還要共用體幹嘛?於是出現正解:

public struct CON_TABLE_TYPE
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public byte[] Adr; // connection address
    // MPI/PB station address (2)
    // IP address (192.168.0.1)
    // Mac address (08-00-06-01-AA-BB)
    public byte AdrType; public byte SlotNr; public byte RackNr;
}
[DllImport("Prodave6.dll")]
public extern static int LoadConnection_ex6(int ConNr, string pAccessPoint, int ConTableLen, ref CON_TABLE_TYPE pConTable);

(2)關於 unsigned char * pBuffer

有兩種轉換選擇:byte[] 或 StringBuilder,視具體情況而定。例如:

int GetErrorMessage_ex6(int ErrorNr, unsigned long BufLen, unsigned char* pBuffer);
void copy_buffer_ex6(unsigned char* pTargetBuffer, unsigned char* pSourceBuffer, unsigned long Amount);

前者轉 StringBuilder,後者轉 byte[]。

(3)部分變量雖為整型但可用枚舉,更合適

例如 db_read_ex6 中的 unsigned char DatType 實際對應 0x02=BYTE, 0x04=WORD, 0x06=DWord,可轉為:

public enum DatType : byte { BYTE = 0x02, Word = 0x04, DWord = 0x06 }
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved