Re: [問題] DllImport
固定長度字串需要特別指定:
[StructLayout(LayoutKind.Sequential)]
public struct TStock
{
public short m_sStockidx;
public byte m_cMarketNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string m_caStockNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string m_caName;
public int m_nOpen;
public int m_nHigh;
public int m_nLow;
public int m_nClose;
}
不過這樣是把字串視為 TCHAR[],不一定等於 char[],所以不確定可不可以。如果不行
的話可以改用下面這個:
[StructLayout(LayoutKind.Sequential)]
public unsafe struct TStock
{
public short m_sStockidx;
public byte m_cMarketNo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] m_caStockNo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] m_caName;
public int m_nOpen;
public int m_nHigh;
public int m_nLow;
public int m_nClose;
}
這樣是一定可以,只是要自己使用 System.Text.Encoding.Default 將字串轉成 byte[]
,後面可能還要記得補 '\0' (如果你重複使用那個欄位的話)。
※ 引述《KIRA0228 (萬般帶不走)》之銘言:
: 小弟使用dllimport 引入廠商的API 結果出現 嘗試是讀取或寫入受保護的記憶體,
: 這通常表示其他記憶體毀損
: C++ API
: int __stdcall SKQuoteLib_GetStockByNo([in] const TCHAR* lpszStockNo,
: [in,out] TStock* pStock)
: typedef struct STOCK
: {
: short m_sStockidx; // 系統自行定義的股票代碼
: char m_cMarketNo; // 市場代號0x00上市;0x01上櫃;0x02期貨;0x03選擇權;0x04興櫃
: char m_caStockNo[20]; // 股票代號
: char m_caName[10]; // 股票名稱
: int m_nOpen; // 開盤價
: int m_nHigh; // 最高價
: int m_nLow; // 最低價
: int m_nClose; // 成交價
: } TStock;
: 小弟的
: C#
: [DllImport("SKQuoteLib.dll",CharSet=CharSet.Ansi)]
: public static extern int SKQuoteLib_GetStockByNo(string strStockNo, ref TStock stk);
: Status= SKQuoteLib_GetStockByNo("2330", ref stock);
: [StructLayout(LayoutKind.Sequential)]
: public struct TStock
: {
: public int Stockidx;
: public byte MarketNo;
: public string StockNo;
: public string StockName;
: public long Open;
: public long High;
: public long Low;
: public long Close;
: }
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.78.32
推
06/14 09:39, , 1F
06/14 09:39, 1F
討論串 (同標題文章)