当前位置:编程学习 > C#/ASP.NET >>

调用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);
--------------------编程问答--------------------


    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;             
    }
--------------------编程问答-------------------- HoloMarketData 最后4个成员在 C/C++ 结构中如果是 long ,就按如下结构
[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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,