作者hamsters (hamster)
看板C_Sharp
标题Re: [问题] DllImport
时间Fri Jun 12 11:35:15 2009
固定长度字串需要特别指定:
[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
1F:推 KIRA0228:感谢大大的解答 可是还是搞不定 看来有其他问题 06/14 09:39