股票行情接收头文件(转)

来源:互联网 发布:知乎 男生喝醉酒找你 编辑:程序博客网 时间:2024/06/02 11:06

{**************************************************************************}
{                                                                          }
{    This C DLL header file first (automatic) conversion generated by:     }
{    HeadConv 4.0 (c) 2000 by Bob Swart (aka Dr.Bob - www.drbob42.com)     }
{      Final Delphi-Jedi (Darth) command-line units edition                }
{                                                                          }
{    Generated Date:  2009/12/7                                            }
{    Generated Time: 15:41:23                                              }
{                                                                          }
{**************************************************************************}
unit Stock_Inf;

interface

uses
  SysUtils,
  Dialogs,
  Forms,
{$IFDEF WIN32}
  Windows;
{$ELSE}
  Wintypes, WinProcs;
{$ENDIF}

{=> E:/Source/Stock/金骄接口规范V1.0演示BCB版/STOCKDRV.H <=}

{+//*************************************************************************************** }
{-* Window 7 金骄行情接口规范V1.0 }
{-* (适用于单向数据传输方式) }
{-* 2009.7.10 }
{-***************************************************************************************** }

{-**************************************************************************************** }
{-* 在通视卡规范基础上,参照飞狐交易师接口规范3.0,进行扩展,实时行情增加涨跌停价; }
{-* 内外盘;期货行情的昨结算价和现结算价;增加补充5分钟线、1分钟线、分笔数据的支持 }
{=*************************************************************************************** }

{+//*************************************************************************************** }
{-* 驱动程序安装后,应该在系统注册表中注册以下信息,分析软件通过该注册信息启动动态库 }
{-* HKEY_LOCAL_MACHINE/SOFTWARE/StockDrv 下 }
{-* Driver = "驱动DLL全路径" }
{=*************************************************************************************** }


{$IFNDEF __STOCKDRV_H__}
{$DEFINE __STOCKDRV_H__}


{$IFDEF _MSC_VER > 1000}
{ #pragma once }
{$ENDIF}

type
  time_t = LongInt;

{////////////////////////////////////////////////////////////////////////////////////////// }

{/// 工作方式类型定义 }
const
  RCV_WORK_SENDMSG = 4; {// 兼容标准图文消息处理模式}
{/// 其他工作方式保留 }

{/// 消息类型 }
  RCV_REPORT = $3f001234;
  RCV_FILEDATA = $3f001235;

{///==================================== 数据结构 ================================================= }
{/// 证券市场 }
  SH_MARKET_EX = 'HS'; {// 上海}
  SZ_MARKET_EX = 'ZS'; {// 深圳}
  HK_MARKET_EX = 'KH'; {// 香港}
  SQ_MARKET_EX = 'QS'; {// 上期}
  DL_MARKET_EX = 'LD'; {// 大连}
  ZZ_MARKET_EX = 'ZZ'; {// 郑州}
  JZ_MARKET_EX = 'JZ'; {// 中金所}
  WP_MARKET_EX = 'PW'; {// 外盘}
  ID_MARKET_EX = 'DI'; {// 国际指数}
  WH_MARKET_EX = 'WH'; {// 外汇}


{/// 文件数据类型 }
  FILE_HISTORY_MIN1_EX = 1; {// 补1分钟K线数据(扩展)}
  FILE_HISTORY_EX = 2; {// 补日线数据}
  FILE_HISTORY_MIN5_EX = 3; {// 补5分钟K线数据(扩展)}
  FILE_MINUTE_EX = 4; {// 补分时线数据}
  FILE_MINUTE_EX1 = 5; {// 补分笔线数据 (扩展)}
  FILE_POWER_EX = 6; {// 补充除权数据}
  FILE_FINANCE_EX = 7; {// 补充财务数据(扩展)}

  FILE_BASE_EX = $1000; {// 基本资料文件,m_szFileName仅包含文件名}
  FILE_NEWS_EX = $1002; {// 新闻类,类型由m_szFileName中子目录名定}
  FILE_HTML_EX = $1004; {// HTML文件,m_szFileName为URL}

  FILE_SOFTWARE_EX = $2000; {// 升级软件}

  FILE_SHAZQDATA_EX = $3000; {// 上海债券净价交易}

  FILE_TYPE_RES = -1; {// 保留}

{/// 消息子类型 }
  News_Sha_Ex = 2; {// 上证消息}
  News_Szn_Ex = 4; {// 深证消息}
  News_Sqn_Ex = 5; {// 期货消息}
  News_Fin_Ex = 6; {// 财经报道}
  News_Unknown_Ex = -1; {// 未知提供者}

{///Definition For nInfo of Function GetStockDrvInfo(int nInfo,void* pBuf); }
  RI_IDSTRING = 1; {// 厂商名称,返回(LPCSTR)厂商名}
  RI_IDCODE = 2; {// 卡号}
  RI_VERSION = 3; {// 驱动程序版本}
  RI_SUPPORTEXTHQ = 6; {// 是否支持JSJ格式}


  STKLABEL_LEN = 10; {// 品种代码长度}
  STKNAME_LEN = 32; {// 品种名称 长度}

{/////////////////////////////////////////////////////////////////////////////////// }
{///行情数据结构,支持期货行情 }
type
  RCV_REPORT_STRUCTEx = record
    m_cbSize: Word;
    m_time: TIME_T;
    m_wMarket: Word;
    m_szLabel: Array[0..STKLABEL_LEN-1] of Char;
    m_szName: Array[0..STKNAME_LEN-1] of Char;
    m_fLastClose: Single;
    m_fOpen: Single;
    m_fHigh: Single;
    m_fLow: Single;
    m_fNewPrice: Single;
    m_fVolume: Single;
    m_fAmount: Single;
    m_fBuyPrice: Array[0..2] of Single;
    m_fBuyVolume: Array[0..2] of Single;
    m_fSellPrice: Array[0..2] of Single;
    m_fSellVolume: Array[0..2] of Single;
    m_fBuyPrice4: Single;
    m_fBuyVolume4: Single;
    m_fSellPrice4: Single;
    m_fSellVolume4: Single;
    m_fBuyPrice5: Single;
    m_fBuyVolume5: Single;
    m_fSellPrice5: Single;
    m_fSellVolume5: Single;
    m_fLastAverage: Single;
    m_fAverage: Single;
    m_fRaisingLimit: Single;
    m_fLimitDown: Single;
    m_wInside: Single;
    m_wOutside: Single;
  end; {tagRCV_REPORT_STRUCTEx}
  PRCV_REPORT_STRUCTEx = ^RCV_REPORT_STRUCTEx;

{/////////////////////////////////////////////////////////////////////////////////// }
{///补充数据头 }
{///数据头 m_dwHeadTag == EKE_HEAD_TAG }
const
  EKE_HEAD_TAG = $ffffffff;

type
  RCV_EKE_HEADEx = record
    m_dwHeadTag: LongInt;
    m_wMarket: Word;
    m_szLabel: Array[0..STKLABEL_LEN-1] of Char;
  end {tagRCV_EKE_HEADEx};
  PRCV_EKE_HEADEx = ^RCV_EKE_HEADEx;
{///补充日线、5分钟、1分钟数据 }
type
  RCV_HISTORY_STRUCTEx = record
    case Word of
     1: (m_Head: RCV_EKE_HEADEx;);
     2: (m_time: TIME_T;);
     3: (m_fOpen: Single;);
     4: (m_fHigh: Single;);
     5: (m_fLow: Single;);
     6: (m_fClose: Single;);
     7: (m_fVolume: Single;);
     8: (m_fAmount: Single;);
     9: (m_wAdvance: Word;);
    10: (m_wDecline: Word;);
  end {tagRCV_HISTORY_STRUCTEx};
  PRCV_HISTORY_STRUCTEx = ^RCV_HISTORY_STRUCTEx;
{///补充分时线数据 }
type
  RCV_MINUTE_STRUCTEx = record
    case Word of
     1: (m_Head: RCV_EKE_HEADEx;);
     2: (m_time: TIME_T;);
     3: (m_fPrice: Single;);
     4: (m_fVolume: Single;);
     5: (m_fAmount: Single;);
  end; {tagRCV_MINUTE_STRUCTEx}
  PRCV_MINUTE_STRUCTEx = ^RCV_MINUTE_STRUCTEx;
{///补充除权数据 }
type
  RCV_POWER_STRUCTEx = record
    case Word of
     1: (m_Head: RCV_EKE_HEADEx;);
     2: (m_time: TIME_T;);
     3: (m_fGive: Single;);
     4: (m_fPei: Single;);
     5: (m_fPeiPrice: Single;);
     6: (m_fProfit: Single;);
  end; {tagRCV_POWER_STRUCTEx}
  PRCV_POWER_STRUCTEx = ^RCV_POWER_STRUCTEx;
{/////////////////////////////////////////////////////////////////////////////////// }
{/// 文件类型数据包头 }
{/// 注一: }
{/// m_wDataType == FILE_BASE_EX }
{/// m_dwAttrib = 股票证券市场,m_szFileName仅包含文件名 }
{/// m_FileTime = 基本面资料文件创建日期 }
{/// m_wDataType == FILE_NEWS_EX }
{/// m_dwAttrib = 消息来源,m_szFileName 包含目录的文件名,目录名为消息来源 }
{/// m_dwSerialNo = 序列号 }
{/// 如: "上交所消息//0501Z012.TXT","新兰德//XLD0001.TXT" }
{/// m_wDataType == FILE_HTML_EX }
{/// m_dwAttrib 保留, m_szFileName为URL }
{/// m_wDataType == FILE_SOFTWARE_EX }
{/// m_dwAttrib 分析软件类型, 用于初步判断 }
{/// m_szFileName 分析软件 ID 特征字符串 + '//' + 文件名 }
{/// 如 "TongShi//TS//RECEIVE//RECEIVE.EXE", }
{/// ID 特征字符串为 "TongShi", "TS//RECEIVE//RECEIVE.EXE" 为文件名 }
{/// 特征字符串 和 文件名及其含义由分析软件商定义 }
{/// 注二: }
{/// 数据文件循环播出,每个文件有唯一的序列号,以避免重复接收 }
type
  RCV_FILE_HEADEX = record
    m_dwAttrib: LongInt;
    m_dwLen: LongInt;
    m_dwSerialNo: LongInt;
    m_szFileName: Array[0..MAX_PATH-1] of Char;
  end; {tagRCV_FILE_HEADEx}
  PRCV_FILE_HEADEx = ^RCV_FILE_HEADEx;

{/////////////////////////////////////////////////////////////////////////////////// }
{/// 数据通知消息 }
{///查询方式通知消息 }
{/// wParam = MsgPara_StkData 有股票数据 }
{/// wParam = MsgPara_File 有文件数据文件 }
{///直接数据引用通知消息 }
{/// wParam = RCV_WPARAM; }
{/// lParam 指向 RCV_DATA结构; }
{/// 返回 1 已经处理, 0 未处理或不能处理,目前该返回值被忽略 }

{/// 注一: }
{/// 记录数表示行情数据和补充数据(包括 Header)的数据包数,对文件类型数据, = 1 }
{/// 注二: }
{/// 若 m_bDISK = FALSE, m_pData 为数据缓冲区指针 }
{///******** 数据共享,不能修改数据********** }
{/// m_bDISK = TRUE, m_pData 为该文件的存盘文件名,一般情况只有 }
{/// 升级软件等大文件用存盘方式 }
type
  RCV_DATA = record
    m_wDataType: Integer;
    m_nPacketNum: Integer;
    m_File: RCV_FILE_HEADEX;
    m_bDISK: Bool;
    m_pReport: PRCV_REPORT_STRUCTEX;
    m_pDay: PRCV_HISTORY_STRUCTEX;
    m_pMinute: PRCV_MINUTE_STRUCTEX;
    m_pPower: PRCV_POWER_STRUCTEX;
    m_pData: Pointer;
  end; {tagRCV_DATA}
  PRCV_DATA=^RCV_DATA;

{+// 消息处理程序 DEMO(VC++) }
{-LONG OnStkDataOK(UINT wParam,LONG lParam) }
{-{ }
{-UINT wFileType = wParam; }
{-RCV_DATA* pHeader; }
{-pHeader = (RCV_DATA* )lParam; }

{-int nBufSize = pHeader->m_pReport[0].m_cbSize; }
{-PBYTE pBaseBuf = (PBYTE)&pHeader->m_pReport[0]; }
{///PBYTE pBaseBuf = (PBYTE)&pHeader->m_pReport[0]-2;//BCB需要减2。 }
{-switch( wFileType ) }
{-{ }
{-case RCV_REPORT: }
{-for(int i=0; i<pHeader->m_nPacketNum; i++) }
{-{ }
{-RCV_REPORT_STRUCTEx & Buf =*(PRCV_REPORT_STRUCTEx)(pBaseBuf + nBufSize*i); }
{-if(Buf.m_fLastClose*1000 <=0) continue; }
{-if(Buf.m_szName == "上证指数") {;}
{///Buf.m_time/60; }
{///Buf.m_wMarket; }
{///Buf.m_szLabel; }
{///Buf.m_szName; }
{///Buf.m_fLastClose; }
{-}
{-break; }

{-case RCV_HISTORYDATA: }
{-switch(pHeader->m_wDataType) }
{-{ }
{-case FILE_HISTORY_EX: }
{-for(i=0; i<pHeader->m_nPacketNum; i++) }
{-{ }
{-pHeader->m_pDay[i] ... }
{///数据处理 }
{/// 请编补日线、5分钟线、1分钟线的调用范例 }
{-}
{-break; }
{-case FILE_HISTORY_MIN5_EX: }
{-break; }
{-case FILE_HISTORY_MIN1_EX: }
{-break; }
{-case FILE_MINUTE_EX: }
{-break; }
{-case FILE_POWER_EX: }
{-break; }
{-case FILE_BASE_EX: }
{-break; }
{-case FILE_NEWS_EX: }
{-break; }
{-case FILE_HTML_EX: }
{-break; }
{-case FILE_SOFTWARE_EX: }
{-break; }
{-}
{-break; }
{-default: }
{-return 0; }
{-}
{-return 1; }
{-}
{= }

{+//消息处理程序 DEMO(BCB C++ Build) }

{-void __fastcall OnStkDataOK(TMessage & Msg) }
{-{ }


{-UINT wFileType = Msg.WParam; }
{-RCV_DATA* pHeader; }
{-pHeader = (RCV_DATA* ) Msg.LParam; }
{-int nBufSize = pHeader->m_pReport[0].m_cbSize; }
{-PBYTE pBaseBuf = (PBYTE)&pHeader->m_pReport[0]-2; }
{-switch( wFileType ) }
{-{ }
{-case RCV_REPORT: }
{-for(int i=0; i<pHeader->m_nPacketNum; i++) }
{-{ }
{-RCV_REPORT_STRUCTEx & Buf =*(PRCV_REPORT_STRUCTEx)(pBaseBuf + nBufSize*i); }
{-if(Buf.m_fLastClose*1000 <=0) continue; }
{-if(AnsiString(Buf.m_szName) == "上证指数") ShowMessage(AnsiString(Buf.m_szLabel)); }
{-数据处理...... }
{-}
{-}
{-}

{= }

{/////////////////////////////////////////////////////////////////////////////////// }
{///APIs }

{/////////////////////////////////////////////////////////////////////////////////// }
{/// 注册函数 }

{/// 股票初始化 }
{/// 入口参数: }
{/// hWnd 处理消息的窗口句柄 }
{/// Msg 用户自定义消息 }
{/// nWorkMode 接口工作方式, 应等于 RCV_WORK_SENDMSG }
{/// 返回参数: }
{/// 1 成功 }
{/// -1 失败 }
//  function Stock_Init(hWnd: HWND;
//                       Msg: Word;
//                       nWorkMode: Integer): Integer {$IFDEF WIN32} stdcall {$ENDIF}; external 'Stock.dll';

{/// 退出,停止发送消息 }
{/// 入口参数: }
{/// hWnd 处理消息的窗口句柄,同 Stock_Init 的调用入口参数 }
{/// 返回参数: }
{/// 1 成功 }
{/// -1 失败 }
//  function Stock_Quit(hWnd: HWND): Integer {$IFDEF WIN32} stdcall {$ENDIF}; external 'Stock.dll';

{/////////////////////////////////////////////////////////////////////////////////// }
{/// 行情接口 }

{/// 取已接收到的股票总数 }
//  function GetTotalNumber: Integer {$IFDEF WIN32} stdcall {$ENDIF}; external 'Stock.dll';

{/// 由序号取股票数据(扩展) }
{/// 入口参数: }
{/// nNo 序号 }
{/// pBuf 存放股票数据的缓冲区 }
{/// 返回参数: }
{/// NoStockData 无股票数据 }
{/// 注: }
{/// 该函数提供股票数据的主要数据;分析软件刚运行时,可以快速建立数据框架 }
//  function GetStockByNoEx(nNo: Integer;
//                           var pBuf: RCV_REPORT_STRUCTEX): Integer {$IFDEF WIN32} stdcall {$ENDIF};
//                           external 'Stock.dll';

{/// 由股号取股票数据(扩展) }
{/// 入口参数: }
{/// pszStockCode股票代号 }
{/// nMarket 证券市场 }
{/// pBuf 存放股票数据的缓冲区 }
{/// 返回参数: }
{/// NoStockData 无股票数据 }
{/// 注: }
{/// 该函数提供股票数据的主要数据;分析软件刚运行时,可以快速建立数据框架 }
//  function GetStockByCodeEx(pszStockCode: PChar;
//                             nMarket: Integer;
//                             var pBuf: RCV_REPORT_STRUCTEX): Integer {$IFDEF WIN32} stdcall {$ENDIF};
//                             external 'Stock.dll';

{/// 激活接收程序,进行设置 }
{/// 入口参数: }
{/// bShowWindow TRUE 显示窗口,进行设置 }
{/// FALSE 隐含窗口 }
{/// 返回参数: }
{/// 1 成功 }
{/// -1 失败 }
//  function SetupReceiver(bShowWindow: Bool): Integer {$IFDEF WIN32} stdcall {$ENDIF};
//    external 'Stock.dll';

{/// 取得股票驱动信息 }
{/// 入口参数: }
{/// nInfo 索引 }
{/// pBuf 缓冲区 }
{/// 出口参数: }
{/// nInfo == RI_IDSTRING, 返回特征字符串长度, pBuf 为特征字符串 }
{/// 如: "TongShi_StockDrv_1.00" }
{/// nInfo == RI_IDCODE, 返回信息卡 ID 号, pBuf 为字符串形式的 ID 号 }
{/// 如: 0x78001234 "78001234" }
{/// nInfo == RI_VERSION, 返回信息卡版本号, pBuf 为字符串版本 }
{/// 如: 1.00 "1.00" }
{/// nInfo == RI_ERRRATE, 取信道误码, }
{/// nInfo == RI_STKNUM, 取上市股票总家数 }
//  function GetStockDrvInfo(nInfo: Integer;
//                            pBuf: Pointer): LongInt {$IFDEF WIN32} stdcall {$ENDIF};
//                          external 'Stock.dll';


{$ENDIF // __STOCKDRV_H__}

type

  TStock_Init      = function (hWnd:HWND;Msg:UINT;nWorkMode:Integer):Integer;stdcall;
  TStock_Quit      = function (hWnd:HWND):Integer;stdcall;
  TSetupReceiver   = function (bSetup:Boolean):integer;stdcall;
  TGetTotalNumber  = function ():Integer;stdcall;
  TGetStockDrvInfo = function (nInfo:Integer;pBuf:Pointer):Integer;stdcall;
  //
  function LoadDLL():Integer;stdcall;
  function FreeDLL():Integer;stdcall;
  //
  function Stock_Init(hWnd:HWND;Msg:UINT;nWorkMode:Integer):Integer;stdcall;
  function Stock_Quit(hWnd:HWND):Integer;stdcall;
  function SetupReceiver(bSetup:Boolean):integer;stdcall;
  function GetTotalNumber():Integer;stdcall;
  function GetStockDrvInfo(nInfo:Integer;pBuf:Pointer):Integer;stdcall;


var
  ftTestNum         : Integer;
  gDLLHandle32      : THandle;
  //
  Stock_Init32      : TStock_Init;
  Stock_Quit32      : TStock_Quit;
  SetupReceiver32   : TSetupReceiver;
  GetTotalNumber32  : TGetTotalNumber;
  GetStockDrvInfo32 : TGetStockDrvInfo;

implementation

function LoadDLL():Integer;stdcall;
var
  sDLLFileName:string;
  sApplicationPath:string;
  //
  function GetWinDir(): string;
  var
    dir: array [0..255] of Char;
  begin
    GetSystemDirectory(dir, 255);
    Result:=StrPas(dir)+'/';
  end;
  function GetApplicationDir():string;
  begin
    Result:=ExtractFilePath(Application.ExeName);
  end;
  //
begin  
  //sDLLFileName:=GetWinDir+'Stock.dll';
  //sDLLFileName:=sApplicationPath+'lib/'+'Stock.dll';
  //sDLLFileName:='D:/NetStock/SCEngine/Stock.dll';
  sDLLFileName:='D:/NetStock/YST/Stock.dll';
  if not FileExists(sDLLFileName) then
  begin
    sApplicationPath:=GetApplicationDir();
    sDLLFileName:=sApplicationPath+'lib/'+'Stock.dll';
  end;
  gDLLHandle32 := LoadLibrary(PChar(sDLLFileName));
  //    gDLLHandle32 := LoadLibrary('niGPIB-32.DLL');
  //   Check to see if library loaded successfully. If the library could
  //     not be loaded, display an error message and then HALT the program.
  if gDLLHandle32 = 0 then
  begin
    MessageDlg('LoadLibrary Failure', mtInformation,[mbOk], 0);
    Result := -1;
    Exit;
  end;

  @Stock_Init32  := GetProcAddress(gDLLHandle32, 'Stock_Init');
  if (@Stock_Init32 = nil) then
  begin
    MessageDlg('Stock_Init32 = nil', mtInformation,[mbOk], 0);
    FreeLibrary(gDLLHandle32);
    Result := -2;
    Exit;
  end;
  @Stock_Quit32  := GetProcAddress(gDLLHandle32, 'Stock_Quit');
  if (@Stock_Quit32 = nil) then
  begin
    MessageDlg('Stock_Quit32 = nil', mtInformation,[mbOk], 0);
    FreeLibrary(gDLLHandle32);
    Result := -2;
    Exit;
  end;
  @SetupReceiver32  := GetProcAddress(gDLLHandle32, 'SetupReceiver');
  if (@SetupReceiver32 = nil) then
  begin
    MessageDlg('SetupReceiver32 = nil', mtInformation,[mbOk], 0);
    FreeLibrary(gDLLHandle32);
    Result := -2;
    Exit;
  end;
  @GetTotalNumber32 := GetProcAddress(gDLLHandle32, 'GetTotalNumber');
  if (@GetTotalNumber32 = nil) then
  begin
    MessageDlg('GetTotalNumber32 = nil', mtInformation,[mbOk], 0);
    FreeLibrary(gDLLHandle32);
    Result := -2;
    Exit;
  end;
  @GetStockDrvInfo32 := GetProcAddress(gDLLHandle32, 'GetStockDrvInfo');
  if (@GetStockDrvInfo32 = nil) then
  begin
    MessageDlg('GetStockDrvInfo32 = nil', mtInformation,[mbOk], 0);
    FreeLibrary(gDLLHandle32);
    Result := -2;
    Exit;
  end;
end;

function FreeDLL():Integer;stdcall;
begin
  if gDLLHandle32 = 0 then
  begin
    Result := -1
  end
  else
  begin
     FreeLibrary(gDLLHandle32);
     Result := 0;
  end;
end;

function Stock_Init(hWnd:HWND;Msg:UINT;nWorkMode:Integer):Integer;stdcall;
begin
  Result:=Stock_Init32(hWnd,Msg,nWorkMode);
end;

function Stock_Quit(hWnd:HWND):Integer;stdcall;
begin
  Result:=Stock_Quit32(hWnd);
end;

function SetupReceiver(bSetup:Boolean):integer;stdcall;
begin
  Result:=SetupReceiver32(bSetup);
end;

function GetTotalNumber():Integer;stdcall;
begin
  Result:=GetTotalNumber32();
end;

function GetStockDrvInfo(nInfo:Integer;pBuf:Pointer):Integer;stdcall;
begin
  Result:=GetStockDrvInfo32(nInfo,pBuf);
end;

initialization
//  LoadDLL;

finalization
//  FreeDLL;

end.

原创粉丝点击