void WINAPI ServiceMain(DWORD argc, char* argv)
{
m_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
m_ServiceStatusHandle = ::RegisterServiceCtrlHandler( g_szServerName, ServiceCtrlHandler );
if( m_ServiceStatusHandle )
{
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
SetServiceStatus( m_ServiceStatusHandle, &m_ServiceStatus );
//TODO
HRESULT hr = StartFSServer(theApp.m_hInstance, &CLSID_WNCOPC);
hr = RegisterServer();
g_pCallBackObj = new CWSCallback();
SetCallbackObject(g_pCallBackObj);
CKernelService::GetInstance()->Run();
}
}
/ * 我想将OPC服务器作为Windows服务使用factorysoft opc服务器工具包。以上是我的ServiceMain功能。指令文档说“接口允许将此DLL添加到现有应用程序以及新的应用程序.FSServer还隐藏OPC详细信息,以便任何类型的应用程序都可以使用它,包括Windows SDK,MFC,控制台应用程序和服务。” ,所以我想我可以在Windows服务中使用它。但是当我运行该服务并使用OPC客户端连接OPC服务器时,它失败了(HR = 80080005)。我发现即使服务正在运行且StartFSServer执行成功,系统仍会尝试运行OPC Server的新实例。谢谢! * /
答案 0 :(得分:0)
看起来您已将OPC服务器转换为Windows服务,但您可能仍将其注册为本地服务器,而不是服务。服务的COM注册表项必须不同。解决此问题的一种方法是查看驻留在Windows服务中的其他COM对象如何在注册表中表示。另一种方式是例如使用ATL创建一个示例COM服务器,使用Visual C ++向导,然后在命令行上使用/ Service运行它,并查看它对注册表的作用。