97 lines
2.9 KiB
C++
97 lines
2.9 KiB
C++
#include <common/windows.hpp>
|
|
#include <common/block.hpp>
|
|
#include <common/systime.hpp>
|
|
#include <common/filemap.hpp>
|
|
#include <common/pview.hpp>
|
|
#include <sgi_stl/map.h>
|
|
|
|
map<int,int> instanceData;
|
|
|
|
typedef struct tagTICKDATA
|
|
{
|
|
float tradePrice;
|
|
float bidPrice;
|
|
float askPrice;
|
|
SYSTEMTIME systemTime;
|
|
bool isTrade;
|
|
}TICKDATA;
|
|
|
|
FileMap fileMap;
|
|
|
|
void createTickData(Block<TICKDATA> &tickData);
|
|
|
|
extern "C"
|
|
{
|
|
__declspec(dllexport) bool PASCAL GetTicks(char *pTickers,SYSTEMTIME *pStartDate,SYSTEMTIME *pEndDate,char *pHandle);
|
|
}
|
|
|
|
bool APIENTRY DllMain(HANDLE hModule,DWORD reason,LPVOID lpReserved)
|
|
{
|
|
switch(reason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
break;
|
|
case DLL_THREAD_ATTACH:
|
|
instanceData[(int)::GetCurrentThreadId]=int((int*)new FileMap());
|
|
// MessageBox(0,"DLLTEST","DLL_THREAD_ATTACH",MB_OK);
|
|
break;
|
|
case DLL_THREAD_DETACH:
|
|
// ::delete (FileMap*)instanceData[(int)::GetCurrentThreadId];
|
|
// MessageBox(0,"DLLTEST","DLL_THREAD_DETACH",MB_OK);
|
|
break;
|
|
case DLL_PROCESS_DETACH:
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool PASCAL GetTicks(char *pTickers,SYSTEMTIME *pStartDate,SYSTEMTIME *pEndDate,char *pDataHandle)
|
|
{
|
|
Block<TICKDATA> tickDataBlock;
|
|
PureViewOfFile pureView;
|
|
|
|
// DebugBreak();
|
|
FileMap *pFileMap=(FileMap*)instanceData[(int)::GetCurrentThreadId()];
|
|
if(!pFileMap){pFileMap=new FileMap();instanceData[(int)::GetCurrentThreadId()]=(int)pFileMap;}
|
|
String str=String(pTickers)+String(" ")+SystemTime(*pStartDate).toString()+String(" ")+SystemTime(*pEndDate).toString();
|
|
// MessageBox(0,"GetTicks",str.str(),MB_OK);
|
|
createTickData(tickDataBlock);
|
|
::sprintf(pDataHandle,"%08lx%08lx",(int)GetCurrentProcessId(),(int)GetCurrentThreadId());
|
|
if(!pFileMap->create((char*)pDataHandle,0,tickDataBlock.size()*sizeof(TICKDATA),FileMap::ReadWrite,FileMap::Commit))return false;
|
|
pureView.createView(*pFileMap);
|
|
pureView.write((int)sizeof(TICKDATA));
|
|
pureView.write((int)tickDataBlock.size());
|
|
for(int index=0;index<tickDataBlock.size();index++)
|
|
{
|
|
TICKDATA &tickData=tickDataBlock[index];
|
|
pureView.write(tickData.tradePrice);
|
|
pureView.write(tickData.bidPrice);
|
|
pureView.write(tickData.askPrice);
|
|
pureView.write((unsigned char*)&tickData.systemTime,sizeof(tickData.systemTime));
|
|
pureView.write(tickData.isTrade);
|
|
}
|
|
pureView.destroyView();
|
|
return true;
|
|
}
|
|
|
|
void createTickData(Block<TICKDATA> &tickDataBlock)
|
|
{
|
|
tickDataBlock.remove();
|
|
|
|
tickDataBlock.insert(&TICKDATA());
|
|
TICKDATA *pTickData=&tickDataBlock[tickDataBlock.size()-1];
|
|
pTickData->tradePrice=100;
|
|
pTickData->bidPrice=0;
|
|
pTickData->askPrice=0;
|
|
pTickData->systemTime=SystemTime(2003,5,1).getSYSTEMTIME();
|
|
pTickData->isTrade=true;
|
|
tickDataBlock.insert(&TICKDATA());
|
|
pTickData=&tickDataBlock[tickDataBlock.size()-1];
|
|
pTickData->tradePrice=0;
|
|
pTickData->bidPrice=101.90;
|
|
pTickData->askPrice=0;
|
|
pTickData->systemTime=SystemTime(2003,5,1).getSYSTEMTIME();
|
|
pTickData->isTrade=false;
|
|
}
|
|
|