工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
VC利用控件传递自定义struct解决方案
[文章信息]
作者:GongXiang
时间:2005-02-22
出处:VCKBASE
责任编辑:方舟
[文章导读]
给出了如何调用含自定义结构的组件函数senddata,ReceiveData的方法
advertisement
热点推荐
· 入侵检测实战之全面问答(上)
· 动画图解:Word表格框线设置
· 没有光驱软驱照样重装系统
· [视频]Photoshop巧除复杂水印
· 解决视频播放故障一例
[正文]
天极开发精彩专题(VC类)
·Visual C++界面常用控件实例技巧 ·Visual C++数据库编程快速入门
·防止Visual C++应用程序缓冲区溢出 ·使用MFC开发ActiveX控件
·Visual C++线程同步技术剖析 ·Visual C++.NET编程基础讲座
·Visual C++图像处理编程讲座 ·Visual C++下OpenGL开发框架与应用


  一、开发工具

  我本来想用的是.ocx控件,最后发现,对于自定义struct,它似乎是无能为力(有谁知道.ocx可以的话请联系我)。最后采用的是vc++6.0中的ATL。下面给出了如何调用含自定义结构的组件函数senddata,ReceiveData的方法。组件中的参数传递与下面的代码是一模一样的 ,这里不再重复。(该组件是应用于配电自动化中的,用以实现馈线自动化FA功能,本人自己设计开发)。

  二、源码

  这里介绍如何向控件传递自己的结构。调用组件函数的源代码如下:

int result;
VARIANT LineVal;
VARIANT DotVal;
SAFEARRAY FAR * pLSA = NULL;
SAFEARRAYBOUND dimension[1];
dimension[0].lLbound =0;
dimension[0].cElements = MAX*10;
pLSA = SafeArrayCreate( VT_BSTR,1,dimension );
Line FAR *pLineData=NULL;
::SafeArrayAccessData(pLSA,( void HUGEP* FAR*) &pLineData );
for (i=0;i<MAX;i++)
{
 pLineData[i].StaPoint_x=LineData[i].StaPoint_x;
 pLineData[i].StaPoint_y=LineData[i].StaPoint_y;
 pLineData[i].EndPoint_x=LineData[i].EndPoint_x;
 pLineData[i].EndPoint_y=LineData[i].EndPoint_y;
 pLineData[i].EndType=LineData[i].EndType;
 pLineData[i].id=LineData[i].id;
 pLineData[i].LineName=LineData[i].LineName;
 pLineData[i].Longth=LineData[i].Longth;
 pLineData[i].Power=LineData[i].Power;
 pLineData[i].ShCirFlag=LineData[i].ShCirFlag;
}

::SafeArrayUnaccessData(pLSA);
LineVal.vt = VT_ARRAY;
LineVal.parray = pLSA;

SAFEARRAY FAR * pDSA = NULL;
Dot FAR *pDotData=NULL;
pDSA = SafeArrayCreate( VT_BSTR , 1, dimension );
::SafeArrayAccessData(pDSA, ( void HUGEP* FAR*) &pDotData );

for (i=0;i<MAX;i++)
{
 pDotData[i].CutFlag=DotData[i].CutFlag;
 pDotData[i].DotName=DotData[i].DotName;
 pDotData[i].DotType=DotData[i].DotType;
 pDotData[i].StaPoint_x=DotData[i].StaPoint_x;
 pDotData[i].StaPoint_y=DotData[i].StaPoint_y;
 pDotData[i].EndPoint_x=DotData[i].EndPoint_x;
 pDotData[i].EndPoint_y=DotData[i].EndPoint_y;
 pDotData[i].HighCurrent=DotData[i].HighCurrent;
 pDotData[i].id=DotData[i].id;
 pDotData[i].Power=DotData[i].Power;
}

::SafeArrayUnaccessData(pDSA);

DotVal.vt = VT_ARRAY;
DotVal.parray = pDSA;

// qfa是控件,
// senddata, ReceiveData是控件中的函数,
// LineVal和DotVal都是自己声明的结构
result=qfa.SendData(LineVal,DotVal,3);

long LineCount,DotCount;

//以下为接收数据
SAFEARRAY FAR * pReLSA = NULL;
SAFEARRAY FAR * pReDSA = NULL;
pReLSA = SafeArrayCreate( VT_BSTR , 1, dimension );
pReDSA = SafeArrayCreate( VT_BSTR , 1, dimension );

Line *pLData=NULL;
Dot *pDData=NULL;
qfa.ReceiveData(&LineVal,&LineCount,&DotVal,&DotCount);

pReLSA = LineVal.parray;
pReDSA = DotVal.parray;

::SafeArrayAccessData(pReDSA, ( void HUGEP* FAR*) &pDotData );
::SafeArrayUnaccessData(pReDSA);

for (int j=0;j<MAX;j++)
{
 DotData[j].HighCurrent=-1;
}

for (i=0;i<DotCount;i++)
{
 for (j=0;j<MAX;j++)
 {
  if (pDotData[i].id==DotData[j].id)
  {
   DotData[j].Power=pDotData[i].Power;
  }
 }
}

//Line 和Dot声明如下
struct Line
{
 long id;//id号
 BOOL Power;//有电标志
 BSTR LineName;//线路名称
 long StaPoint_x;//起点x
 long StaPoint_y;//起点y
 long EndPoint_x;//终点x
 long EndPoint_y;//终点y
 short EndType;//1 负荷 2 电源 0 其它
 long Longth;
 BOOL ShCirFlag;//短路标志
};

struct Dot
{
 long id;
 BOOL Power;//开合标志
 BSTR DotName;//线路名称
 long StaPoint_x;//起点x
 long StaPoint_y;//起点y
 long EndPoint_x;//终点x
 long EndPoint_y;//终点y
 short DotType;//可操作标志0 断路器不可遥控 1 断路器可遥控 2 刀闸 3 线路节点 4 变压器
 short HighCurrent;//过流标志 -1未有过流数据 >=0有过流数据
 BOOL CutFlag;//跳闸标志
};

//在ATL的idl文件中需要声明如下:
typedef
[
 uuid(D124B04A-C5F9-4a16-9671-1E67B75DB1A1),
 helpstring("NetWork Node Struct")
]

struct Line
{
 long id;//id号
 BOOL Power;//有电标志
 BSTR LineName;//线路名称
 long StaPoint_x;//起点x
 long StaPoint_y;//起点y
 long EndPoint_x;//终点x
 long EndPoint_y;//终点y
 short EndType;//1 负荷 2 电源 0 其它
 long Longth;
 BOOL ShCirFlag;//短路标志
}Line;

typedef
[
 uuid(D124B04A-C5F9-4a16-9671-1E67B75DB1A2),
 helpstring("NetWork Node Struct")
]

struct Dot
{
 long id;
 BOOL Power;//开合标志
 BSTR DotName;//线路名称
 long StaPoint_x;//起点x
 long StaPoint_y;//起点y
 long EndPoint_x;//终点x
 long EndPoint_y;//终点y
 short DotType;//可操作标志0 断路器不可遥控 1 断路器可遥控 2 刀闸 3 线路节点 4 变压器
 short HighCurrent;//过流标志
 BOOL CutFlag;//跳闸标志
}Dot;


  然后就可以随意使用这两种结构了。

  三、结束语

  需要更多代码,请看例子源码.但是组件QFA2004的源码不能提供,请原谅。同时希望有更好办法的高手们提供更好的传递自定义struct的方法。源码使用方法:首先应注册QFA2004组件 。regsvr32 c:\qfa2004.dll(c:\目录根据qfa2004.dll的目录更改),然后用VC++6.0打开,编译。


天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • MFC程序员的WTL指南之包容ActiveX
  • 用递归算法解决VC中CEdit的一个Bug
  • 木马中如何编程实现远程关机(VC版)
  • VC下利用OpenGL构造自由型曲线曲面
  • MFC程序员的WTL指南之高级界面类
  • 手机牌照核准制细则颁布 多数企业仍难入围
  • 3GSM重新定义手机概念 未来注重娱乐共享
  • 盛大收购新浪并非义气之举 两年前曾图谋搜狐
  • 上海贝尔阿尔卡特加码电子政务 提升目标值
  • 购并新浪是战略措施 如有竞购盛大将出售牟利
  • 樱桃好吃树难栽:信息化离物流小企业有点远
  • 贵州某预备役师:提高打赢信息化战争的能力
  • 平面媒体进军网络市场 新闻集团力拓网络商机
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索