在Windows服务中使用factorysoft opc服务器工具包

时间:2014-05-30 06:18:47

标签: windows service com opc

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的新实例。谢谢! * /

1 个答案:

答案 0 :(得分:0)

看起来您已将OPC服务器转换为Windows服务,但您可能仍将其注册为本地服务器,而不是服务。服务的COM注册表项必须不同。解决此问题的一种方法是查看驻留在Windows服务中的其他COM对象如何在注册表中表示。另一种方式是例如使用ATL创建一个示例COM服务器,使用Visual C ++向导,然后在命令行上使用/ Service运行它,并查看它对注册表的作用。