看板 C_Sharp 關於我們 聯絡資訊
固定長度字串需要特別指定: [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
KIRA0228:感謝大大的解答 可是還是搞不定 看來有其他問題 06/14 09:39