110,533
社区成员
发帖
与我相关
我的任务
分享
class CThostFtdcMdSpi
{
virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
}
struct CThostFtdcRspInfoField
{
int ErrorID;
char ErrorMsg[81];
};
virtual void RegisterSpi(CThostFtdcMdSpi *pSpi) = 0;
class CMdSpi : public CThostFtdcMdSpi
{
private:
gcroot<MdSpiWrapper^> m_hMdSpi;
public:
CMdSpi(MdSpiWrapper ^mdSpi)
{
m_hMdSpi = mdSpi;
}
virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
m_hMdSpi->RaiseRspErrorEvent(pRspInfo, nRequestID, bIsLast);
}
}
class CMdSpi : public CThostFtdcMdSpi
{
private:
gcroot<MdSpiWrapper^> m_hMdSpi;
public:
CMdSpi(MdSpi ^mdSpi)
{
m_hMdSpi = mdSpi;
}
virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
m_hMdSpi->RaiseRspErrorEvent(pRspInfo, nRequestID, bIsLast);
}
}
定义托管类MdSpiWrapper,在其中存放CMdSpi的指针。
public ref class MdSpiWrapper
{
private:
CMdSpi *m_pCMdSpi;
public:
event EventHandler<RspErrorEventArgs^> ^OnRspError;
void RaiseRspErrorEvent(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
OnRspError(this, gcnew RspErrorEventArgs(pRspInfo, nRequestID, bIsLast));
}
}
其中,RspErrorEventArgs定义如下:
public ref class RspErrorEventArgs : public EventArgs
{
public:
ThostFtdcRspInfoField ^RspInfo;
int RequestID;
bool IsLast;
RspErrorEventArgs(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
RspInfo->ErrorID = pRspInfo->ErrorID;
RspInfo->ErrorMsg = gcnew String(pRspInfo->ErrorMsg);
RequestID = nRequestID;
IsLast = bIsLast;
}
};
其中,ThostFtdcRspInfoField定义如下:
public value struct ThostFtdcRspInfoField
{
int ErrorID;
[MarshalAs(UnmanagedType::ByValTStr, SizeConst = 81)]
String ^ErrorMsg;
};
我现在不知道这样做到底行不行,因为我无法编译通过,而编译错误让我无法理解。编译器提示的错误是:
error C2143: syntax error : missing ';' before '^'
出错位置在RspErrorEventArgs中定义ThostFtdcRspInfoField ^RspInfo的位置。大侠能不能看出为什么编译出错?
#include "dll.h"
using namespace System;
using namespace System::Runtime::InteropServices;
typedef void (*RspErrorCallback)(CThostFtdcRspInfoField*, int, bool);
namespace CppInvoke
{
public ref class RspErrorEventArgs : public EventArgs
{
public:
int ErrorID;
String^ ErrorMsg;
int RequestID;
bool IsLast;
RspErrorEventArgs(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
this->ErrorID = pRspInfo->ErrorID;
this->ErrorMsg = gcnew String(pRspInfo->ErrorMsg);
this->RequestID = nRequestID;
this->IsLast = bIsLast;
}
};
class CThostFtdcMdSpiImpl : public CThostFtdcMdSpi
{
public:
CThostFtdcMdSpiImpl(RspErrorCallback ecb)
{
this->RaiseRspError = ecb;
}
virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
this->RaiseRspError(pRspInfo, nRequestID, bIsLast);
}
void Test(void)
{
Console::WriteLine("Test");
}
private:
RspErrorCallback RaiseRspError;
};
delegate void RspErrorDel(CThostFtdcRspInfoField*, int, bool);
public ref class CThostFtdcMdSpiWrapper
{
private:
CThostFtdcMdSpiImpl* nestImplClass;
public:
CThostFtdcMdSpiWrapper()
{
this->nestImplClass = new CThostFtdcMdSpiImpl(
(RspErrorCallback)Marshal::GetFunctionPointerForDelegate(
gcnew RspErrorDel
(
this,
&CppInvoke::CThostFtdcMdSpiWrapper::RaiseRspError
)
).ToPointer()
);
}
~CThostFtdcMdSpiWrapper()
{
delete nestImplClass;
}
event EventHandler<RspErrorEventArgs^>^ RspError;
void RaiseRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
RspError(this, gcnew RspErrorEventArgs(pRspInfo, nRequestID, bIsLast));
}
static void RegisterSpi(CThostFtdcMdSpiWrapper^ spi)
{
::RegisterSpi(spi->nestImplClass);
}
};
}
C#调用:
using System;
using CppInvoke;
class Program
{
static void Main(string[] args)
{
using (var c = new CThostFtdcMdSpiWrapper())
{
CThostFtdcMdSpiWrapper.RegisterSpi(c);
c.RspError += (_, e) =>
{
Console.WriteLine("ErrorId = {0}, ErrorMsg = \"{1}\", RequestId = {2}, IsLast = {3}", e.ErrorID, e.ErrorMsg, e.RequestID, e.IsLast);
};
//其他操作
}
}
}