那位大侠帮忙把VC++的代码转换成BCB的?

gfh_79_0 2004-08-05 09:32:21


//
// callback.cpp : Defines the class behaviors for the callback
// This callback object receives the connection point
// callbacks from the OPC server
//

#include "pre_opc.h" // for OPC: include MFC, ATL and OPC header files - for OPC only
#include "OPCDA_Async.h" // include class declaration for application class
#include "OPCDA_AsyncDlg.h" // include class declaration of dialog class

#include "Callback.h" // for OPC: include class declaration fpr this callback class

CString GetQualityText(UINT qnr);
// for OPC: prototype for a helper function to get OPC quality
// text description from quality code

/////////////////////////////////////////////////////////////////////////////
//
// IOPCDataCallback - implementation

// OnDataChange called by OPC server when the OPC server has detected modified data
// (being called only when group and item is set to active)

STDMETHODIMP COPCDataCallback:: OnDataChange(
/* [in] */ DWORD dwTransid,
/* [in] */ OPCHANDLE hGroup,
/* [in] */ HRESULT hrMasterquality,
/* [in] */ HRESULT hrMastererror,
/* [in] */ DWORD dwCount,
/* [size_is][in] */ OPCHANDLE __RPC_FAR *phClientItems,
/* [size_is][in] */ VARIANT __RPC_FAR *pvValues,
/* [size_is][in] */ WORD __RPC_FAR *pwQualities,
/* [size_is][in] */ FILETIME __RPC_FAR *pftTimeStamps,
/* [size_is][in] */ HRESULT __RPC_FAR *pErrors)
{

// The input parameters dwTransid, hGroup, hrMasterquality, hrMastererror, pErrors are not checked within this sample...

CString szReadVal; // CString array with values as text
CString szReadQuality; // CString array with quality texts
CString szReadTS; // CString array with timeStamps as text

CComVariant * pvarOut; // ATL wrapper for VARIANT data type
DWORD i;
for (i = 0; i<dwCount; i++) {
pvarOut = new CComVariant(pvValues[i]); // create VARIANT and init with received value
pvarOut->ChangeType(VT_BSTR); // change Variant Type to String
szReadVal.Format("%ls", pvarOut->bstrVal);
// put BSTR in CString
delete pvarOut; // delete VARIANT
szReadQuality=GetQualityText(pwQualities[i]);
// Call helper function to get text description
szReadTS=COleDateTime( pftTimeStamps[i] ).Format();
// MFC OLE Date wrapper used to change to CString

switch (phClientItems[i]) {
case 0:
m_pCDlgClass->DisplayData0(szReadVal, szReadQuality, szReadTS);
// Call OPCDa_AsyncDlg::Display Data0 Method to
// show Data for Item 0 in Dialog
break;

case 1:
m_pCDlgClass->DisplayData1(szReadVal, szReadQuality, szReadTS);
// Call OPCDa_AsyncDlg::Display Data1 Method to
// show Data for Item 1 in Dialog
break;
default: ASSERT(0); // SHOULD NEVER HAPPEN
}
}


return S_OK;
};

//
// OnReadComplete is being called by OPC server when an async read request has been carried out
//

STDMETHODIMP COPCDataCallback::OnReadComplete(
/* [in] */ DWORD dwTransid,
/* [in] */ OPCHANDLE hGroup,
/* [in] */ HRESULT hrMasterquality,
/* [in] */ HRESULT hrMastererror,
/* [in] */ DWORD dwCount,
/* [size_is][in] */ OPCHANDLE __RPC_FAR *phClientItems,
/* [size_is][in] */ VARIANT __RPC_FAR *pvValues,
/* [size_is][in] */ WORD __RPC_FAR *pwQualities,
/* [size_is][in] */ FILETIME __RPC_FAR *pftTimeStamps,
/* [size_is][in] */ HRESULT __RPC_FAR *pErrors)
{


// The input parameters dwTransid, hGroup, hrMasterquality, hrMastererror, pErrors are not checked within this sample...

/* if no error: Update Data */
if (pErrors[0] == S_OK) {
CComVariant * pvarOut; // ATL wrapper for VARIANT data type
pvarOut = new CComVariant(pvValues[0]); // create VARIANT and init with received value
pvarOut->ChangeType(VT_I4); // change Variant Type to signed long
CString readQuality = GetQualityText(pwQualities[0]);
// Call helper function to get text description
CString readTS = COleDateTime( pftTimeStamps[0] ).Format();
// MFC OLE Date wrapper used to change to CString
m_pCDlgClass->DisplayData(pvarOut->intVal,readQuality, readTS);
// Call OPCDa_AsyncDlg::Display Data Method to
// show Data in Dialog
delete pvarOut;
} else {
/* error case: display error text */
CString readQuality = GetQualityText(pErrors[0]);
m_pCDlgClass->DisplayData(0,readQuality,"");
}


return S_OK;
};


//
// OnWriteComplete called by OPC server when an async write request has been carried out
//
STDMETHODIMP COPCDataCallback::OnWriteComplete(
/* [in] */ DWORD dwTransid,
/* [in] */ OPCHANDLE hGroup,
/* [in] */ HRESULT hrMastererr,
/* [in] */ DWORD dwCount,
/* [size_is][in] */ OPCHANDLE __RPC_FAR *pClienthandles,
/* [size_is][in] */ HRESULT __RPC_FAR *pErrors)
{

/* Display Error Text */

m_pCDlgClass->DisplayData(pErrors[0]);

return S_OK;
};

//
// Converts opc quality codes into text strings
//

CString GetQualityText(UINT qnr)
{ CString qstr;

switch(qnr)

{ case OPC_QUALITY_BAD: qstr = "BAD";
break;
case OPC_QUALITY_UNCERTAIN: qstr = "UNCERTAIN";
break;
case OPC_QUALITY_GOOD: qstr = "GOOD";
break;
case OPC_QUALITY_NOT_CONNECTED: qstr = "NOT_CONNECTED";
break;
case OPC_QUALITY_DEVICE_FAILURE:qstr = "DEVICE_FAILURE";
break;
case OPC_QUALITY_SENSOR_FAILURE:qstr = "SENSOR_FAILURE";
break;
case OPC_QUALITY_LAST_KNOWN: qstr = "LAST_KNOWN";
break;
case OPC_QUALITY_COMM_FAILURE: qstr = "COMM_FAILURE";
break;
case OPC_QUALITY_OUT_OF_SERVICE:qstr = "OUT_OF_SERVICE";
break;
case OPC_QUALITY_LAST_USABLE: qstr = "LAST_USABLE";
break;
case OPC_QUALITY_SENSOR_CAL: qstr = "SENSOR_CAL";
break;
case OPC_QUALITY_EGU_EXCEEDED: qstr = "EGU_EXCEEDED";
break;
case OPC_QUALITY_SUB_NORMAL: qstr = "SUB_NORMAL";
break;
case OPC_QUALITY_LOCAL_OVERRIDE:qstr = "LOCAL_OVERRIDE";
break;
default: qstr = "UNKNOWN ERROR";
}
return qstr;
}


...全文
301 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
gfh_79_0 2004-08-15
  • 打赏
  • 举报
回复
感谢各位的帮助!
  • 打赏
  • 举报
回复
OPC没有做过实际应用。
是COM接口,ATL的实现,BCB的COM接口和delphi不同,也是ATL的实现。
你需要熟悉COM接口和应用。
但是BCB做COM,不如VC。因为CB所带的ATL版本为了和VCL兼容,以及两家编译器的一些差别,CB的版本作了些修改。

呵呵,我不是很喜欢COM,更不喜欢在bcb下开发COM应用。

CComVariant应该是atl封装的VARIANT实现,bcb也能支持,需要包含atl的一些头文件。
ldhao 2004-08-07
  • 打赏
  • 举报
回复
呵呵
有个专门是vc to bcb的工具的!
gfh_79_0 2004-08-07
  • 打赏
  • 举报
回复
to jishiping(JSP 季世平) :

又试了试还是不可以,错误还是和上面一样。

to cker(〖烟波浩淼三千里、人鬼殊途五百年〗)

就算石化行业的吧。

我后转到计算机的,功底太差,E文也不好,
都有点不好意思麻烦大家了。
  • 打赏
  • 举报
回复
OPC?你在做电力还是石化行业?
jishiping 2004-08-07
  • 打赏
  • 举报
回复
需要包含头文件 sysvari.h
gfh_79_0 2004-08-07
  • 打赏
  • 举报
回复
to jishiping(JSP 季世平) :

STDMETHODIMP COPCDataCallback:: OnDataChange(
/* [in] */ DWORD dwTransid,
/* [in] */ OPCHANDLE hGroup,
/* [in] */ HRESULT hrMasterquality,
/* [in] */ HRESULT hrMastererror,
/* [in] */ DWORD dwCount,
/* [size_is][in] */ OPCHANDLE __RPC_FAR *phClientItems,
/* [size_is][in] */ VARIANT __RPC_FAR *pvValues,
/* [size_is][in] */ WORD __RPC_FAR *pwQualities,
/* [size_is][in] */ FILETIME __RPC_FAR *pftTimeStamps,
/* [size_is][in] */ HRESULT __RPC_FAR *pErrors)
{



CString szReadVal;
CString szReadQuality;
CString szReadTS;
CComVariant * pvarOut;
DWORD i;
for (i = 0; i<dwCount; i++) {
pvarOut = new CComVariant(pvValues[i]); pvarOut->ChangeType(VT_BSTR); szReadVal.Format("%ls", pvarOut->bstrVal);
delete pvarOut; szReadQuality=GetQualityText(pwQualities[i]);
szReadTS=COleDateTime( pftTimeStamps[i] ).Format();
}
}

我把 CComVariant 都该为 TVariant 提示
[C++ Error] MainForm.cpp(74): E2450 Undefined structure 'TVariant'
[C++ Error] MainForm.cpp(74): E2034 Cannot convert 'tagVARIANT' to 'TVariant'
。。。
该怎么改呢?

to geochway(geochway)
编译不过去啊。

gfh_79_0 2004-08-06
  • 打赏
  • 举报
回复
CComVariant * pvarOut;
这个类型在BCB里对应什么类型呢?
constantine 2004-08-06
  • 打赏
  • 举报
回复
找个两样都比较厉害的帮你
gigilee 2004-08-06
  • 打赏
  • 举报
回复
你先查查那些头文件在bcb里面是否有
geochway 2004-08-06
  • 打赏
  • 举报
回复
不用转,你在project选项中include路径加上:
$(BCB)\include\mfc
$(BCB)\include\atl
在advanced compiler中把MFC compatibility选上
jishiping 2004-08-06
  • 打赏
  • 举报
回复
CComVariant,BCB中对应的应该是 TVariant
gfh_79_0 2004-08-05
  • 打赏
  • 举报
回复
这是VC例子,
我喜欢用BCB
但转不过来了,
帮帮忙了,大家
JetKingLau 2004-08-05
  • 打赏
  • 举报
回复
晕,这么长……
yjy1001 2004-08-05
  • 打赏
  • 举报
回复
不懂VC —— 坚持BCB —— 别学VC

13,872

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧