程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 控件如何傳遞自定義struct

控件如何傳遞自定義struct

編輯:關於VC++

一、開發工具

我本來想用的是.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打開,編譯。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved