使用命令行注册和反注册OPC 服务器的实现方法 点击:2303 | 回复:1



opcfan

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:62帖 | 58回
  • 年度积分:0
  • 历史总积分:667
  • 注册:2004年9月29日
发表于:2007-02-17 16:51:00
楼主
使用命令行注册和反注册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函数。而对于EXE组件程序可以在命令行中输入组件的路径和名称后,加上RegServer参数。当然用户还可以通过编写一个Reg文件,然后执行该文件也可以实现注册组件的功能,对于EXE组件可以运行它,然后再注册。

二、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组件的反注册。
四、 结论
  这两个实例的代码对于初学者来说可以更好地理解我们在注册和反注册组件的时候,组件程序到底做了什么动作。



冷咖啡

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 512回
  • 年度积分:0
  • 历史总积分:686
  • 注册:2006年5月07日
发表于:2007-02-17 17:09:00
1楼
路过,顶一下

热门招聘
相关主题

官方公众号

智造工程师