OPCEnum.EXE在OPC服务器的使用方法 点击:2167 | 回复:2



opcfan

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:62帖 | 58回
  • 年度积分:0
  • 历史总积分:667
  • 注册:2004年9月29日
发表于:2007-02-19 12:49:00
楼主

E-Mail:zhan826@163.com
MSN:zhan826@hotmail.com
QQ:10167223

OPCEnum.EXE除了大家比较熟悉的作用:即在客户程序用来枚举服务器ProgID外,在服务器中主要是用来实现服务器类别的注册。
hr = CreateComponentCategory( CATID_OPCDAServer20, 
L"OPC Data Access Servers Version 2.0");
hr = RegisterCLSIDInCategory( CLSID_OPCServer, CATID_OPCDAServer20 );
CreateComponentCategory是个自定义的函数,其本质就是调用OPCEnum.EXE的RegisterCategories方法。
RegisterCLSIDInCategory也是个自定义的函数,其本质及就是调用OPCEnum.EXE的RegisterClassImplCategories方法。



opcfan

  • 精华:0帖
  • 求助:0帖
  • 帖子:62帖 | 58回
  • 年度积分:0
  • 历史总积分:667
  • 注册:2004年9月29日
发表于:2008-07-31 13:03:06
1楼
以上内容有误,请见谅

opcfan

  • 精华:0帖
  • 求助:0帖
  • 帖子:62帖 | 58回
  • 年度积分:0
  • 历史总积分:667
  • 注册:2004年9月29日
发表于:2008-07-31 13:35:18
2楼

客户端正确调用OPCEnum.exe的接口范例

void CKServerGeneralPage::DisplayComponentCatList (HTREEITEM hParent, CATID catid)
{
HRESULT hr;

// Make sure COM is initialized:
hr = CoInitializeEx (NULL, COINIT_MULTITHREADED);

if (SUCCEEDED (hr))
{
IOPCServerList *pCat = NULL;

// Get component category manager:CLSID_StdComponentCategoriesMgr
hr = CoCreateInstance (CLSID_OPCServerList,
NULL,
CLSCTX_SERVER,
//IID_ICatInformation,
IID_IOPCServerList,
(void **)&pCat);

// If succeeded, enumerate registered components:
if (SUCCEEDED (hr))
{
IOPCEnumGUID *pEnum = NULL;

CATID arrcatid [1];
arrcatid [0] = catid;

// Enumerate registered components based on clsid:
hr = pCat->EnumClassesOfCategories (
sizeof (arrcatid) / sizeof (CATID),//number of catids in the array that follows
arrcatid, // catid array
0,
NULL,
(IEnumGUID**)&pEnum); // clsid enumerator for registered components under this category

// If succeeded, process results:
if (SUCCEEDED (hr))
{
GUID guid;
ULONG fetched;

// Loop over enumerated components. Call enemerator's next
// member function to reference next component and get its
// guid:
while ((hr = pEnum->Next (1, &guid, &fetched)) == S_OK)
{
// Get the ProgID from the guid:
LPOLESTR pszProgID;
LPOLESTR pszUserType;
hr = pCat->GetClassDetails(guid, &pszProgID, &pszUserType);
#ifdef _UNICODE
m_pServerList->InsertItem (pszProgID, ILI_COMPONENT, ILI_COMPONENT, hParent);
#else
TCHAR szProgID [DEFBUFFSIZE];

_wcstombsz (szProgID, pszProgID, sizeof (szProgID) / sizeof (TCHAR));
m_pServerList->InsertItem (szProgID, ILI_COMPONENT, ILI_COMPONENT, hParent);
#endif
CoTaskMemFree(pszProgID);
CoTaskMemFree(pszUserType);

/* WCHAR *wszProgID;
hr = ProgIDFromCLSID (guid, &wszProgID);

// If succeeded, add component to list:
if (SUCCEEDED (hr))
{
// ProgID string will be in UNICODE format. Convert to
// ANSI format if this is and ANSI build. Insert component
// into list:
#ifdef _UNICODE
m_pServerList->InsertItem (wszProgID, ILI_COMPONENT, ILI_COMPONENT, hParent);
#else
TCHAR szProgID [DEFBUFFSIZE];

_wcstombsz (szProgID, wszProgID, sizeof (szProgID) / sizeof (TCHAR));
m_pServerList->InsertItem (szProgID, ILI_COMPONENT, ILI_COMPONENT, hParent);
#endif
// It is up to us to free the Prog ID string memory:
CoTaskMemFree (wszProgID);

}
*/ }

// Release our enumerator:
pEnum->Release ();
}

// release our category mamager
pCat->Release ();
}

// Uninitialize COM:
CoUninitialize ();
}

}


热门招聘
相关主题

官方公众号

智造工程师