class CManagerInterface
{
public:
//--- reports
virtual TradeRecord* __stdcall ReportsRequest(const ReportGroupRequest
*req,const int *logins,int *total) =0;
...
以上内容位于.h
文件中
现在我在.cpp
中,我想要一个main()
(已经准备好struct ReportGroupRequest
和登录名数组)来调用ReportRequest
。
如何调用该函数?
文档说:
” *
CManagerInterface::ReportsRequest
//Gets information about closed positions of clients in order to generate a custom reports.
TradeRecord* CManagerInterface::ReportsRequest(
const ReportGroupRequest* req, // Request
const int* logins, // List of logins
int* total // Number of received records
)
参数 要求
[in]描述请求参数的ReportGroupRequest结构。 登录
[in]用于请求信息的登录名列表。 总计
[out]函数返回的记录数。
返回值
如果成功,该方法将返回一个指向描述贸易记录的TradeRecord结构数组的指针。记录数被添加到“总计”中。如果失败,则返回NULL。* “
//+------------------------------------------------------------------+
//| Functions |
//+------------------------------------------------------------------+
typedef int (*MtManVersion_t)(void);
typedef int (*MtManCreate_t)(int version,CManagerInterface **man);
//+------------------------------------------------------------------+
//| Factory |
//+------------------------------------------------------------------+
#ifndef _MT4MANDLL
class CManagerFactory
{
private:
HMODULE m_lib;
MtManVersion_t m_pfnManVersion;
MtManCreate_t m_pfnManCreate;
public:
//--- constructor
CManagerFactory(LPCSTR lib_path=NULL):m_lib(NULL)
{
Init(lib_path);
}
//--- destructor
~CManagerFactory()
{
if(m_lib)
{
m_pfnManVersion=NULL;
m_pfnManCreate =NULL;
::FreeLibrary(m_lib);
m_lib=NULL;
}
}
//--- initialization
inline void Init(LPCSTR lib_path=NULL)
{
char path[256]="";
//---
if(lib_path!=NULL)
{
strcpy(path,lib_path);
path[sizeof(path)-1]=0;
}
else
{
#ifndef _WIN64
strcpy_s(path,"mtmanapi.dll");
path[sizeof(path)-1]=0;
#else
strcpy(path,"mtmanapi64.dll");
path[sizeof(path)-1]=0;
#endif
}
//---
if(m_lib)
::FreeLibrary(m_lib);
if((m_lib=::LoadLibraryA(path))!=NULL)
{
m_pfnManVersion=reinterpret_cast<MtManVersion_t>(::GetProcAddress(m_lib,"MtManVersion"));
m_pfnManCreate =reinterpret_cast<MtManCreate_t>(::GetProcAddress(m_lib,"MtManCreate"));
}
else
{
m_pfnManVersion=NULL;
m_pfnManCreate =NULL;
}
//---
}
//--- winsock startup/cleanup
inline int WinsockStartup() const
{
WSADATA wsa;
return(WSAStartup(0x0202,&wsa)!=0 ? RET_ERROR:RET_OK);
}
inline void WinsockCleanup() const
{
WSACleanup();
}
//---
inline int IsValid() const
{
return(m_lib!=NULL && m_pfnManVersion!=NULL && m_pfnManCreate!=NULL) ? TRUE:FALSE;
}
inline int Version() const
{
return(m_pfnManVersion?(*m_pfnManVersion)():0);
}
inline CManagerInterface* Create(const int version) const
{
CManagerInterface *man=NULL;
if(m_pfnManCreate) (*m_pfnManCreate)(version,&man);
return(man);
}
};
#endif
//+------------------------------------------------------------------+
非常感谢, 大卫(Davide)
答案 0 :(得分:0)
正如我在评论中所说,主要问题是如何获取CManagerInterface
对象。现在,我可以看到整个标头,发现有一个CManagerFactory
类。该类的目的是创建CManagerInterface
对象
所以您需要这样的东西
CManagerFactory factory;
CManagerInterface* intf = factory.Create(version);
TradeRecord* records = intf->ReportsRequest(...);
您已经创建了报告请求参数(...
),因此可以自己填写该部分。
现在这里有些事情我不理解。我不知道version
应该是什么,我想您可以尝试0
看看会发生什么。
CManagerFactory
对于某些库路径(即
CManagerFactory factory(path);
但是我也不知道那应该是什么,或者根本不需要它。
希望这能带您到某个地方。
编辑
也许这样会更好一些,我添加了一些错误处理功能,并且最好地猜测如何获得该版本。
CManagerFactory factory;
if (!factory.IsValid())
cerr << "invalid factory\n";
int version = factory.Version();
CManagerInterface* intf = factory.Create(version);
if (!intf)
cerr << "could not create interface\n";
TradeRecord* records = intf->ReportsRequest(...);