У меня есть приложение, разговаривающее с OPC-сервером. Когда я запускаю его как службу Windows, он не может открыть соединение с OPC-сервером. Когда я активирую опцию "Разрешить услугу взаимодействовать с рабочим столом", она работает! Но как я могу сделать это по умолчанию для моего сервисного приложения. Я попытался использовать флаг SERVICE_INTERACTIVE_PROCESS для функции API "CreateService", но с ошибкой 0x0057 (Invalid Parameter).
// Install the service into SCM by calling CreateService
schService = CreateService(
schSCManager, // SCManager database
pszServiceName, // Name of service
pszDisplayName, // Name to display
SERVICE_QUERY_STATUS, // Desired access
SERVICE_WIN32_OWN_PROCESS, // Service type
dwStartType, // Service start type
SERVICE_ERROR_NORMAL, // Error control type
szPath, // Service binary
NULL, // No load ordering group
NULL, // No tag identifier
pszDependencies, // Dependencies
pszAccount, // Service running account
pszPassword // Password of the account
);
if (schService == NULL)
{
wprintf(L"CreateService failed w/err 0x%08lx\n", GetLastError());
goto Cleanup;
}
Для pszAccount и pszPassword используются NULL для использования локальной системной учетной записи.
schService = CreateService(
schSCManager, // SCManager database
pszServiceName, // Name of service
pszDisplayName, // Name to display
SERVICE_QUERY_STATUS, // Desired access
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS, // Service type
dwStartType, // Service start type
SERVICE_ERROR_NORMAL, // Error control type
szPath, // Service binary
NULL, // No load ordering group
NULL, // No tag identifier
pszDependencies, // Dependencies
pszAccount, // Service running account
pszPassword // Password of the account
);
CreateService сообщит об этой ошибке, если параметр типа службы установлен неправильно:
Если вы укажете SERVICE_WIN32_OWN_PROCESS или SERVICE_WIN32_SHARE_PROCESS, а служба будет запущена в контексте учетной записи LocalSystem, вы также можете указать следующее значение: SERVICE_INTERACTIVE_PROCESS