一、開發工具
我本來想用的是.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打開,編譯。
本文配套源碼