__declspec(dllexport) int WINAPI SOS(CALCINFO* pData){
typedef int(*pHHV)(int,int);
typedef int(*pLLV)(int,int);
HINSTANCE hDLL=LoadLibrary("DLLFMLFUN.dll");
pHHV HHV=(pHHV)GetProcAddress(hDLL,"HHV");
pLLV LLV=(pLLV)GetProcAddress(hDLL,"LLV");
int i;
for (i=0;i<pData->m_nNumData;i++)
{
pData->m_pResultBuf[i]=(pData->m_pData[i].m_fClose-LLV(pData->m_pData[i].m_fLow,60))/(HHV(pData->m_pData[i].m_fHigh,60)-LLV(pData->m_pData[i].m_fLow,60))*80;
FreeLibrary(hDLL);
}
return 0;}

解决方案 »

  1.   

    检查一下:hDLL、HHV、LLV 的值
      

  2.   

    调用的dll是网上的,软件调用可以,用dll链接没有任何数据。是不是我的里面缺东西?编译是成功的。
    太菜了,自己。
      

  3.   

    没数据?你是说m_pResultBuf里没数据?
      

  4.   

    我首先做了个HHLL.dll
    源码如下。测试成功。__declspec(dllexport) int WINAPI HHV(CALCINFO* pData){float f,fTotal;const float* pValue;int n,nFirst,i,j;if(pData->m_pfParam1 && pData->m_pfParam2 && //参数1,2有效pData->m_nParam1Start>=0 && //参数1为序列数pData->m_pfParam3==NULL) //有2个参数{pValue = pData->m_pfParam1; //参数1nFirst = pData->m_nParam1Start; //有效值f = *pData->m_pfParam2;n = (int)f; //参数2if(n>0) //**********当n>0{for(i=nFirst;i<pData->m_nNumData;i++){fTotal=pValue[i];if(i-nFirst<n){for(j=nFirst;j<i;j++){if(pValue[j]>fTotal) fTotal=pValue[j];}}else{for(j=1;j<n;j++){if(pValue[i-j]>fTotal) fTotal=pValue[i-j];}}pData->m_pResultBuf[i] = fTotal;}return nFirst;}if(n==0) //当n=0时执行下面代码,一定要记住要写为n==0{fTotal=pValue[nFirst];pData->m_pResultBuf[nFirst] = fTotal;for(i=nFirst+1;i<pData->m_nNumData;i++){if(pValue[i]>fTotal){fTotal = pValue[i];}pData->m_pResultBuf[i] = fTotal;}return nFirst;}}return -1;}
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    __declspec(dllexport) int WINAPI LLV(CALCINFO* pData){float f,fTotal;const float* pValue;int n,nFirst,i,j;if(pData->m_pfParam1 && pData->m_pfParam2 && //参数1,2有效pData->m_nParam1Start>=0 && //参数1为序列数pData->m_pfParam3==NULL) //有2个参数{pValue = pData->m_pfParam1; //参数1nFirst = pData->m_nParam1Start; //有效值f = *pData->m_pfParam2;n = (int)f; //参数2if(n>0) //**********当n>0{for(i=nFirst;i<pData->m_nNumData;i++){fTotal=pValue[i];if(i-nFirst<n){for(j=nFirst;j<i;j++){if(pValue[j]<fTotal) fTotal=pValue[j];}}else{for(j=1;j<n;j++){if(pValue[i-j]<fTotal) fTotal=pValue[i-j];}}pData->m_pResultBuf[i] = fTotal;}return nFirst;}if(n==0) //当n=0时执行下面代码,一定要记住要写为n==0{fTotal=pValue[nFirst];pData->m_pResultBuf[nFirst] = fTotal;for(i=nFirst+1;i<pData->m_nNumData;i++){if(pValue[i]<fTotal){fTotal = pValue[i];}pData->m_pResultBuf[i] = fTotal;}return nFirst;}}return -1;}
      

  5.   

    然后我开始在新的工程里的FoxFunc.h
    里添加了
    #pragma comment(lib,"HHLL.lib")
    extern "C"__declspec(dllimport)  int  HHV(int,int);
    extern "C"__declspec(dllimport)  int  LLV(int,int);//////////////////////////////////////////////////////变为了#ifndef __FOXFUNC_H_INCLUDE
    #define __FOXFUNC_H_INCLUDE
    #pragma comment(lib,"HHLL.lib")
    extern "C"__declspec(dllimport)  int  HHV(int,int);
    extern "C"__declspec(dllimport)  int  LLV(int,int);
    /*
    ///////////////////////////////////////////////////////////////////////////
    飞狐交易师“C语言接口”扩展程序调用接口规范V3.0
    1.本规范适用于飞狐交易师V3.x公式系统.
    2.扩展函数用于实现系统函数不能实现的特殊算法.
    3.扩展函数用windows 32位动态连接库实现,建议使用Microsoft Visual C++编程.
    4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FOXFUNC@MYMACLOSE"(5)
    5.动态连接库名称和函数名称可以自己定义.
    6.使用时必须将动态库拷贝到飞狐交易师安装目录下的FmlDLL子目录下使用.
    */#ifdef __cplusplus
    extern "C"
    {
    #endif //__cplusplus///////////////////////////////////////////////////////////////////////////
    //分析周期
    enum DATA_TYPE
    {
    TICK_DATA=2, //分笔成交
    MIN1_DATA, //1分钟线
    MIN5_DATA, //5分钟线
    MIN15_DATA, //15分钟线
    MIN30_DATA, //30分钟线
    MIN60_DATA, //60分钟线
    DAY_DATA, //日线
    WEEK_DATA, //周线
    MONTH_DATA, //月线
    YEAR_DATA, //年线
    MULTIDAY_DATA, //多日线
    MULTIMIN_DATA //多分钟线
    };///////////////////////////////////////////////////////////////////////////
    //基本数据typedef struct tagSTKDATA
    {
    time_t m_time; //时间,UCT
    float m_fOpen; //开盘
    float m_fHigh; //最高
    float m_fLow; //最低
    float m_fClose; //收盘
    float m_fVolume; //成交量
    float m_fAmount; //成交额
    WORD m_wAdvance; //上涨家数 仅大盘有效
    WORD m_wDecline; //下跌家数 仅大盘有效
    } STKDATA;////////////////////////////////////////////////////////////////////////////
    //扩展数据,用于描述分笔成交数据的买卖盘typedef union tagSTKDATAEx
    {
    struct
    {
    float m_fBuyPrice[3]; //买1--买3价
    float m_fBuyVol[3]; //买1--买3量
    float m_fSellPrice[3]; //卖1--卖3价
    float m_fSellVol[3]; //卖1--卖3量
    };
    float m_fDataEx[12];
    } STKDATAEx;////////////////////////////////////////////////////////////////////////////
    //除权数据typedef struct tagSPLITDATA
    {
    time_t m_time; //时间,UCT
    float m_fHg; //红股
    float m_fPg; //配股
    float m_fPgj; //配股价
    float m_fHl; //红利
    } SPLITDATA;
    /////////////////////////////////////////////////////////////////////////////
    /*财务数据顺序(m_pfFinData内容) 序号 内容 0 总股本(万股),
    1 国家股,
    2 发起人法人股,
    3 法人股,
    4 B股,
    5 H股,
    6 流通A股,
    7 职工股,
    8 A2转配股,
    9 总资产(千元),
    10 流动资产,
    11 固定资产,
    12 无形资产,
    13 长期投资,
    14 流动负债,
    15 长期负债,
    16 资本公积金,
    17 每股公积金,
    18 股东权益,
    19 主营收入,
    20 主营利润,
    21 其他利润,
    22 营业利润,
    23 投资收益,
    24 补贴收入,
    25 营业外收支,
    26 上年损益调整,
    27 利润总额,
    28 税后利润,
    29 净利润,
    30 未分配利润,
    31 每股未分配,
    32 每股收益,
    33 每股净资产,
    34 调整每股净资,
    35 股东权益比,
    36 净资收益率
    *//////////////////////////////////////////////////////////////
    //调用参数项结构
    typedef struct tagCALCPARAM
    {
    union 
    {
    const float* m_pfParam; //序列参数,指向一个浮点型数组
    const float m_fParam; //数值参数
    };
    const int m_nParamStart; //序列参数有效起始位置
    }CALCPARAM;
    /////////////////////////////////////////////////////////////////////////////
    //调用接口信息数据结构
    typedef struct tagCALCINFO
    {
    const DWORD m_dwSize; //结构大小
    const DWORD m_dwVersion; //调用软件版本(V2.10 : 0x210)
    const DWORD m_dwSerial; //调用软件序列号
    const char* m_strStkLabel; //股票代码
    const BOOL m_bIndex; //大盘 const int m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)
    const STKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为 NULL
    const STKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为 NULL const int m_nParam1Start; //参数1有效起始位置
    const float* m_pfParam1; //调用参数1
    const float* m_pfParam2; //调用参数2
    const float* m_pfParam3; //调用参数3
    const float* m_pfParam4; //调用参数3 float* m_pResultBuf; //结果缓冲区
    const DWORD m_dataType; //数据类型
    const float* m_pfFinData; //财务数据//以上与分析家兼容,所以沿用其结构和名称//以下为飞狐交易师扩展 const DWORD m_dwReserved; // 保留 const int m_nNumParam; // 调用参数数量
    const CALCPARAM* m_pCalcParam; // 调用参数数组 const DWORD m_dwReservedEx[4]; // 保留 char* m_strStkName; //股票名称 SPLITDATA* m_pSplitData; //除权数据
    int m_nNumSplitData; //除权次数} CALCINFO;/* 
    注1: (与分析家兼容)
    1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
    2.当一个参数无效时,则其后的所有参数均无效.
    如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.
    3.参数1可以是常数参数或序列数参数,其余参数只能为常数参数.
    4.若m_nParam1Start<0, 则参数1为常数参数,参数等于*m_pfParam1;
    5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
    数组大小为m_nNumData,数据有效范围为 m_nParam1Start 至 m_nNumData-1.
    在时间上m_pData[x] 与 m_pfParam1[x]是一致的注2: (飞狐交易师扩展)
    1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都可为数值或序列,由公式中实际的调用参数决定。
    2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为 0 至 m_nNumParam-1.
    3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Start、m_pfParam1等5个属性依然有赋值。
    4.若 i位置的参数为数值,取用m_pCalcParam[i].m_fParam.
    5.若 i位置的参数为序列,取用m_pCalcParam[i].m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam[i].m_nParamStart 至 m_nNumData-1. 若m_pCalcParam[i].m_nParamStart<0, 则此数组中无有效数据。
    6.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
    7.经此扩展,对分析家的DLL依然可以调用、兼容。*/
    ///////////////////////////////////////////////////////////////////////////////////
    /* 函数输出__declspec(dllexport) int xxxxxxxx(CALCINFO* pData);1.函数名称需全部大写.
    2.函数必须以上述形式声明,请用实际函数名称替代xxxxxxxx;
    对于C++程序还需包括在 extern "C" {   } 括号中.
    3.函数计算结果用pData->m_pResultBuf带回.
    4.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:
    m_pResultBuf[返回值] -- m_pResultBuf[m_nNumData-1]间为有效值.
    5.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER*///示例函数,使用时用实际名称替换
    __declspec(dllexport) int WINAPI SOS(CALCINFO* pData);#ifdef __cplusplus
    }
    #endif //__cplusplus
    #endif //__FOXFUNC_H_INCLUDE
      

  6.   

    然后我在FoxFunc.cpp里加上了
    __declspec(dllexport) int WINAPI SOS(CALCINFO* pData){ int i;
    for (i=0;i<pData->m_nNumData;i++)
    {
    pData->m_pResultBuf[i]=(pData->m_pData[i].m_fClose-LLV(pData->m_pData[i].m_fLow,60))/(HHV(pData->m_pData[i].m_fHigh,60)-LLV(pData->m_pData[i].m_fLow,60))*80;}
    return 0;}
    ///////////////////////////////////////////////FoxFunc.cpp内容变为了
    // FoxFunc.cpp : Defines the entry point for the DLL application.
    //#include "StdAfx.h"
    #include "FoxFunc.h"
    #include <fstream.h>
    #include "stdio.h"
    #include "windows.h"
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
        }
        return TRUE;
    }//////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////__declspec(dllexport) int WINAPI SOS(CALCINFO* pData){ int i;
    for (i=0;i<pData->m_nNumData;i++)
    {
    pData->m_pResultBuf[i]=(pData->m_pData[i].m_fClose-LLV(pData->m_pData[i].m_fLow,60))/(HHV(pData->m_pData[i].m_fHigh,60)-LLV(pData->m_pData[i].m_fLow,60))*80;}
    return 0;
    }
    /////结束
    不知道那里错了。
      

  7.   

    隐式链接调试成功,但是组建失败。
    信息是:
    --------------------Configuration: FoxFunc - Win32 Debug--------------------
    Linking...
       Creating library Debug/学习.lib and object Debug/学习.exp
    FoxFunc.obj : error LNK2001: unresolved external symbol __imp__HHV
    FoxFunc.obj : error LNK2001: unresolved external symbol __imp__LLV
    学习.dll : fatal error LNK1120: 2 unresolved externals
    执行 link.exe 时出错.学习.dll - 1 error(s), 0 warning(s)
      

  8.   

    HHV和LLV两个函数未实现?你给的代码我没看到实现,都只是函数的定义。
      

  9.   

    (沙漠乌鸦)你好,您的意思是说把pData->m_pResultBuf的值变成变量返回吗?
    能帮我看看HHV具体要怎么做吗?谢谢。