[問題] C# 引用 C++ dll的問題

看板C_Sharp (C#)作者 (老爹)時間13年前 (2012/05/21 19:01), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串1/1
我目前開發的程式語言是C#,最近拿到一個API的文件,需引用HsFutuSDK.dll裡的 function 已我所知的,我目前只能使用DllImport三個function 1. IFuMessage* HSAPI NewFuMessage(int iMsgType = MSG_TYPE_UNKNOWN,int iMsgMode = MSG_MODE_UNKNOWN); 2. IHsFutuComm* HSAPI NewFuCommObj(void* lpReserved = NULL); 3. int HSAPI GetSDKVersion();(已能呼叫成功) 我的問題,大概都在於如何改成讓C#可使用他struct裡的功能,如: 1. 是要如何去引用在 IHsFutuComm 裡的function 如 SetConfig、Start等。 2. 像virtual unsigned long HSAPI QueryInterface( const char * iid, IHSKnown **ppv ) = 0; 這種的重新宣告成C# 要如何改 是否有人能解我疑惑?感激!!!! C++使用的範例內容的程式標頭檔,例了一些,如下: #ifndef _FUTU_MESSAGE_INTERFACE_H_ #define _FUTU_MESSAGE_INTERFACE_H_ #include "futu_data_types.h" #ifdef _WIN32 # ifdef HSAPI # undef HSAPI # endif # define HSAPI __stdcall #else # define HSAPI #endif struct IHSKnown { virtual unsigned long HSAPI QueryInterface( const char * iid, IHSKnown **ppv ) = 0; virtual unsigned long HSAPI AddRef() = 0; virtual unsigned long HSAPI Release() = 0; }; struct IFuMessage:public IHSKnown { virtual int HSAPI SetMsgType(int iType,int iMode) = 0; virtual int HSAPI GetMsgType(int* lpMsgMode = NULL) = 0; virtual int HSAPI GetCount() = 0; virtual IFuRecord* HSAPI AddRecord() = 0; virtual IFuRecord* HSAPI GetRecord(int iIndex = 0) = 0; virtual int HSAPI DelRecord(int iIndex = 0) = 0; virtual int HSAPI Clear() = 0; }; struct IFuRecord:public IHSKnown { virtual int HSAPI SetChar(const char* sField,char cValue) = 0; virtual int HSAPI SetInt(const char* sField,int iValue) = 0; virtual int HSAPI SetDouble(const char* sField,double dValue) = 0; virtual int HSAPI SetString(const char* sField,const char* strValue) = 0; virtual char HSAPI GetChar(const char* sField) = 0; virtual int HSAPI GetInt(const char* sField) = 0; virtual double HSAPI GetDouble(const char* sField) = 0; virtual const char* HSAPI GetString(const char* sField) = 0; virtual int HSAPI MoveFirst() = 0; virtual int HSAPI MoveNext() = 0; virtual int HSAPI IsEOF() = 0; virtual const char* HSAPI GetFieldName() = 0; virtual int HSAPI RemoveField(const char* sField) = 0; virtual int HSAPI IsExist(const char* sField) = 0; virtual int HSAPI Clear() = 0; virtual int HSAPI GetCount() = 0; }; struct IHsFutuComm:public IHSKnown { virtual int HSAPI SetConfig(const char* szSection,const char* szName,const char* szVal) = 0; virtual int HSAPI Init(IFuCallBack* lpCallback = NULL,int iTimeOut = 5000) = 0; virtual int HSAPI Start(int iType,int iTimeOut = 5000) = 0; virtual int HSAPI DoLogin(const char *szUserID,const char* szUserPass,const void* lpReserved = NULL) = 0; virtual int HSAPI AsyncSend(const IFuMessage* lpReqMsg,int iKeyID = -1) = 0; virtual int HSAPI SyncSendRecv(const IFuMessage* lpReqMsg,IFuMessage* lpAnsMsg,int iTimeout = 3000) = 0; virtual int HSAPI SubscribeRequest(REGType rType,REGAction rAction,const char* szParam) = 0; virtual int HSAPI DoLogout(const char* szUserID,const void* lpReserved = NULL) = 0; virtual int HSAPI Stop() = 0; virtual int HSAPI GetStatus(int iIndex) = 0; virtual const char* HSAPI GetErrorMsg(int iErrNo) = 0; virtual int HSAPI SetKeyData(const void* lpKeyData,int iLen) = 0; virtual const void* HSAPI GetKeyData(int* iLen) = 0; }; struct IFuCallBack:public IHSKnown { virtual void HSAPI OnNotifyConnState(IHsFutuComm* lpComm,int iType,int iStatus,const char* szNotifyTime,const char* szMessage) = 0; virtual void HSAPI OnRspLogin(IHsFutuComm* lpComm,IFuMessage* lpMsg) = 0; virtual void HSAPI OnRspLogout(IHsFutuComm* lpComm,IFuMessage* lpMsg) = 0; virtual void HSAPI OnRspSubResult(IHsFutuComm* lpComm,REGType sType,REGAction aAction,int iResult,const char* lpParam,const char* szMessage) = 0; virtual void HSAPI OnReceivedBiz(IHsFutuComm* lpComm,IFuMessage* lpAnsData,int iRet,int iKeyID) = 0; virtual void HSAPI OnRecvMarketData(IHsFutuComm* lpComm,CMarketInfo* lpInfo,REGAction rAction) = 0; virtual void HSAPI OnRecvArgMarketData(IHsFutuComm* lpComm,CArgMarketInfo* lpInfo,REGAction rAction) = 0; virtual void HSAPI OnRecvOrderInfo(IHsFutuComm* lpComm,const COrderRspInfo* lpInfo) = 0; virtual void HSAPI OnRecvOrderRealInfo(IHsFutuComm* lpComm,const CRealRspInfo* lpInfo) = 0; virtual void HSAPI OnRspOnlineMsg(IHsFutuComm* lpComm,const char* szUsrID,const char* szMessage) = 0; }; #ifdef __cplusplus extern "C" { #endif IFuMessage* HSAPI NewFuMessage(int iMsgType = MSG_TYPE_UNKNOWN,int iMsgMode = MSG_MODE_UNKNOWN); IHsFutuComm* HSAPI NewFuCommObj(void* lpReserved = NULL); int HSAPI GetSDKVersion(); #ifdef __cplusplus } #endif -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.38.240.23

05/22 01:38, , 1F
請參考 http://ppt.cc/-Ao5 網頁最下方的對照表
05/22 01:38, 1F

05/22 13:55, , 2F
我幹過蠢事,自己寫個DLL去控制 C++ DLL。界面重包一下...
05/22 13:55, 2F

05/23 08:36, , 3F
不好意思,請問有相關範例可參考嗎!?
05/23 08:36, 3F
文章代碼(AID): #1FkY2SoI (C_Sharp)
文章代碼(AID): #1FkY2SoI (C_Sharp)