调用C++函数,参数是结构体,结构体里再带指针,取不到返回值
--------------------编程问答-------------------- --------------------编程问答-------------------- 我即使预先分配内存到结构体变量中,结果还是一样.--------------------编程问答--------------------
private IntPtr InitQueue(int nSize)
{
IntPtr pt = IntPtr.Zero;
int nStructSize = Marshal.SizeOf(typeof(HoloQueueItem));
if (nSize > 0)
{
HoloQueueItem[] queue = new HoloQueueItem[nSize];
IntPtr[] ptArray = new IntPtr[1];
ptArray[0] = Marshal.AllocHGlobal(nStructSize * nSize);
pt = Marshal.AllocHGlobal(nStructSize);
Marshal.Copy(ptArray, 0, pt, 1);
}
return pt;
}
// 函数调用
HoloPosition pHolo = new HoloPosition();
pHolo.pHeadOfAskQueue = InitQueue(2000);
pHolo.pHeadOfBidQueue = InitQueue(2000);
pHolo.marketData = new HoloMarketData();
IntPtr pData = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(HoloPosition)));
Marshal.StructureToPtr(pHolo, pData, true);
TDF_GetHoloPosition(strMarket, strCode, ref pData);
[DllImport("")]--------------------编程问答--------------------
extern static int GetPosition([MarshalAs(UnmanagedType.LPStr)]string lpMarket, [MarshalAs(UnmanagedType.LPStr)]string lpCode, HoloPosition* pReqHoloData);
[StructLayout(LayoutKind.Sequential)]
unsafe struct HoloPosition
{
public fixed byte szMarKet[8];
public fixed byte szCode[16];
public int nSizeOfAskQueue;
public HoloQueueItem* pHeadOfAskQueue;
public int nCountOfBidQueue;
public HoloQueueItem* pHeadOfBidQueue;
HoloMarketData marketData;//这个类型未知
}
[StructLayout(LayoutKind.Sequential)]
struct HoloQueueItem
{
public int nTime;
public int nPrice;
public int nVolume;
public int nNumOrder;
}
//调用
HoloPosition data;
GetPosition(strMarket, strCode, &data);
--------------------编程问答-------------------- HoloMarketData 最后4个成员在 C/C++ 结构中如果是 long ,就按如下结构
public struct HoloMarketData
{
public int nTime;
public int nPreClose;
public int nOpen;
public int nHigh;
public int nLow;
public int nMatch;
public int nNumTrades;
public Int64 iVolume;
public Int64 iTurnover;
public Int64 iTotalBidVol;
public Int64 iTotalAskVol;
}
[StructLayout(LayoutKind.Sequential)]
unsafe struct HoloMarketData
{
public int nTime;
public int nPreClose;
public int nOpen;
public int nHigh;
public int nLow;
public int nMatch;
public int nNumTrades;
public void* iVolume;
public void* iTurnover;
public void* iTotalBidVol;
public void* iTotalAskVol;
}
和3楼的代码组合使用
补充:.NET技术 , C#