欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → [C++]请教一个dll接口中,函数参数传递的问题

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有3525人关注过本帖树形打印复制链接

主题:[C++]请教一个dll接口中,函数参数传递的问题

帅哥哟,离线,有人找我吗?
damoncles
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:18 积分:0 威望:0 精华:0 注册:2016/8/18 15:48:26
[C++]请教一个dll接口中,函数参数传递的问题  发帖心情 Post By:2016/8/18 16:56:06 [只看该作者]

请教下,Dll接口中,下面两种参数传递有什么区别啊?什么时候该用哪种方式


 const int   m_nNumParam;   // 调用参数数量
 const CALCPARAM* m_pCalcParam;   // 调用参数数组

 

 

const int   m_nParam1Start;   //参数1有效起始位置
 const float*  m_pfParam1;    //调用参数1 
 const float*  m_pfParam2;    //调用参数2
 const float*  m_pfParam3;    //调用参数3
 const float*  m_pfParam4;    //调用参数4


 回到顶部
帅哥哟,离线,有人找我吗?
damoncles
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:18 积分:0 威望:0 精华:0 注册:2016/8/18 15:48:26
  发帖心情 Post By:2016/8/18 16:56:47 [只看该作者]

typedef struct tagCALCPARAM
{
 union
 {
  float* m_pfParam;    //序列参数,指向一个浮点型数组 
  float m_fParam;    //数值参数 
 };
 int m_nParamStart;   //序列参数有效起始位置
}CALCPARAM;

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
damoncles
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:18 积分:0 威望:0 精华:0 注册:2016/8/18 15:48:26
  发帖心情 Post By:2016/8/18 17:00:20 [只看该作者]

为什么参数传递进来,有时候是这样写的

__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData)
{
 if ( pData->m_pfParam1 &&    //参数1有效
   pData->m_nParam1Start<0 &&   //参数1为常数
   pData->m_pfParam2==NULL )   //仅有一个参数

 

有时候却是这样的

__declspec(dllexport) int WINAPI MYBBI(CALCINFO* pData)
{
 if ( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
   pData->m_pCalcParam[1].m_nParamStart >= 0 &&
   pData->m_pCalcParam[2].m_nParamStart >= 0 &&
   pData->m_pCalcParam[3].m_nParamStart >= 0 )   //4个序列都含有效数值
 {
  //计算返回的序列的第一个有效值位置
  int nFirst = pData->m_pCalcParam[3].m_nParamStart;  //已知返回的序列的第一个有效值位置与第4个序列一致


 回到顶部
帅哥哟,离线,有人找我吗?
damoncles
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:18 积分:0 威望:0 精华:0 注册:2016/8/18 15:48:26
  发帖心情 Post By:2016/8/18 17:01:31 [只看该作者]

是不是参数数量小于等于4个,用第二种,大于4个用第一种?

 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2016/8/18 17:35:46 [只看该作者]

以下是引用damoncles在2016-8-18 17:00:20的发言:

为什么参数传递进来,有时候是这样写的

__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData)
{
 if ( pData->m_pfParam1 &&    //参数1有效
   pData->m_nParam1Start<0 &&   //参数1为常数
   pData->m_pfParam2==NULL )   //仅有一个参数

 

有时候却是这样的

__declspec(dllexport) int WINAPI MYBBI(CALCINFO* pData)
{
 if ( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
   pData->m_pCalcParam[1].m_nParamStart >= 0 &&
   pData->m_pCalcParam[2].m_nParamStart >= 0 &&
   pData->m_pCalcParam[3].m_nParamStart >= 0 )   //4个序列都含有效数值
 {
  //计算返回的序列的第一个有效值位置
  int nFirst = pData->m_pCalcParam[3].m_nParamStart;  //已知返回的序列的第一个有效值位置与第4个序列一致

 

这个主要取决于你在PEL中调用的方式来决定的,前面的是

"STOCKFUNC@MYMACLOSE"(5) 只有1个参数传递进去,所以只使用pData->m_pfParam1就可以了

 

后面的那个  MYBBI: "STOCKFUNC@MYBBI"(MA1, MA2, MA3, MA4, 4); 使用了5个参数,因此要使用m_pCalcParam扩展的数组结构,因为第中参数结构只能最多传递4个参数进去,这些我们都在工程中做了详尽的说明了,这里再照抄如下

 

/*
注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.取用m_pCalcParam[i].m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam[i].m_nParamStart 至 m_nNumData-1. 若m_pCalcParam[i].m_nParamStart<0, 则此数组中无有效数据。
 5.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。

*/

 



金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2016/8/18 17:37:47 [只看该作者]

另外需要提醒的是,由于金字塔进程不允许调试,如果你对接口数据某些东西不是很理解传递了什么进去,你可以使用txt日志记录的方式,运行时将你需要了解的数据项写文件进去,这样同样起到了调试效果


金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
帅哥哟,离线,有人找我吗?
damoncles
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:18 积分:0 威望:0 精华:0 注册:2016/8/18 15:48:26
  发帖心情 Post By:2016/8/19 11:22:55 [只看该作者]

哦,基本理解了,应该就是看参数传递进去是序列还是常数以及参数个数的区别了,谢谢哈


 回到顶部
帅哥哟,离线,有人找我吗?
分析者
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:319 积分:0 威望:0 精华:1 注册:2015/11/1 14:20:16
  发帖心情 Post By:2017/2/9 15:43:19 [只看该作者]

请问,可以一次返回多个数组吗?

 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2017/2/9 16:14:55 [只看该作者]

不可以


金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部