使用命令行注册和反注册OPC 服务器的实现方法
Method of Registering and Unregistering OPC Server by Command Line
作者:詹根基 陈冲 Mail:zhan826@hotmail.com
【内容摘要】本文通过一个具体的事例,讲述如何通过命令行注册及反注册OPC服务器程序,并给出了Visual C++程序代码,希望能给初学者对注册和反注册OPC服务器提供一个本质的理解,对于其它组件程序注册的原理也是相通的。
一、 前言
基于COM(组件对象模型 )的组件程序是服务器程序(OPC服务器实际上就是一种工业上使用的COM组件),以EXE或者DLL的形式提供给客户程序使用。普通的DLL程序如果通过LoadLibrary函数显式加载,需要给定DLL的路径和名称;而组件程序的路径对于客户程序来说是透明的,客户程序只要通过组件程序的ProgID来加载组件程序即可。客户程序在调用组件程序的时候,首先要通过注册表查询到组件程序的路径并进行加载,所以组件程序一定会实现把自己的信息写到注册表的功能,这些信息主要包括CLSID、ProgID、程序的路径等。在使用组件之前一定会首先把这些信息写到注册表里。
在PC上,对于注册DLL组件程序可以使用RegSvr32命令来注册组件程序,组件程序一定要实现DllRegisterServer这个API函数,具体如图-1所示:
图-1
而对于EXE组件程序可以在命令行中输入组件的路径和名称后,加上RegServer参数,如图-2所示:
图-2
当然用户还可以通过编写一个Reg文件,然后执行该文件也可以实现注册组件的功能,对于EXE组件可以运行它,然后再注册。本文着重讲述图-1和图-2的实现方法。
二、DLL组件的注册与反注册
目前,在Window CE平台上开发OPC服务器程序一定是做成DLL的组件,也就是进程内组件。需要注意的是,在该平台上是使用RegSvrCE命令来实现注册组件程序的;RegisterServer函数就是实现写注册表的功能。
extern "C" HRESULT __stdcall DllRegisterServer()
{
CString HelpPath;
int i;
HelpPath = AfxGetApp()->m_pszHelpFilePath;
i = HelpPath.ReverseFind(_T('//'));
HelpPath = HelpPath.Left(i+1);
HelpPath += _T("OPCRTDB.dll");
return RegisterServer(CLSID_OPCRTDB,// Class ID
HelpPath, // DLL路径
_T("RTDBOPC.Svr.1"),//ProID
_T("This is a read time database based on OPC!"),// Description String
_T("Developed by zhan genji")
);// optional
}
反注册其实就是执行删除注册表的动作,在DLL里要实现DllUnregisterServer这个API函数。在命令行中执行RegSvr32 /u在加具体的DLL路径和名称就会调用DllUnregisterServer这个API函数,实现反注册。
extern "C" HRESULT __stdcall DllUnregisterServer()
{
return UnregisterServer(CLSID_Dictionary,
" RTDBOPC.Svr.1",NULL);
}
三、EXE组件的注册与反注册
在BOOL CHurcoOPCSvrApp::InitInstance()里实现如下代码:
TCHAR szTokens[] = _T("-/");
CString HelpPath;
CString SvrName, SvrDescrip;
int i;
HelpPath = AfxGetApp()->m_pszHelpFilePath;
i = HelpPath.ReverseFind('//');
HelpPath = HelpPath.Left(i+1);
HelpPath += "HurcoOPCSvr.exe";
SvrName = "Hurco.OPCServer";
SvrDescrip = "Hurco Software OPC Server ";
CString tempCmdLine(m_lpCmdLine);
LPTSTR lpszToken = _tcstok(tempCmdLine.GetBuffer(1), szTokens);
while (lpszToken != NULL)
{
if (_tcsicmp(lpszToken, _T("UnregServer"))==0)//反注册
{
UnregisterServer ((BYTE *)&CLSID_Hurco, SvrName);//删除注册表
return (FALSE);
}
else if (_tcsicmp(lpszToken, _T("RegServer"))==0)//注册
{
//写入到注册表
UpdateRegistry ((BYTE *)& CLSID_Hurco,SvrName,SvrDescrip,HelpPath);
return (FALSE);
}
lpszToken = _tcstok(NULL, szTokens);
}
在命令行中输入组件的路径和名称后,加上UnregServer参数就可以实现Exe组件的反注册。