Windows 7 64 비트에서 서비스로 실행되는 64 비트 응용 프로그램이 있습니다. 서비스를 수동으로 시작하면 매번 제대로 작동합니다. 시스템 시작과 함께 서비스가 자동으로 시작될 때 (10 분의 1과 같은 경우) 실패합니다. 사실 LoadLibrary 함수가 문제입니다. 그것은 대부분의 코드가있는 DLL의로드입니다. 나는 내 컴퓨터에서 그것을 재현 할 수 없으므로 나는 동료에게 특별한 테스트 바이너리를 보내고있다. 버퍼링되지 않은 쓰기 작업을 사용하여 텍스트 출력을 파일에 추가하여 사라지는 위치를 정확히 볼 수 있습니다. 크래시 덤프가 없습니다. 예외가 없습니다. NULL이 검색되지 않고 LoadLibrary의 어느 곳에서나 종료되고 시스템 시작 후 서비스가 실행되지 않습니다. 우리 도서관에는 DllMain이 없지만 내가 추가하면 거기에 가지 않습니다 (실패한 경우). 종속 시스템 라이브러리의로드 지연을 시도했지만 성공하지 못했습니다. 가끔 뭔가가 Windows에서 아직 시작되지 않았으므로 초기화가 실패하는 것처럼 보입니다. 확실하지 않습니다. 하지만 LoadLibrary가 잠자기 전에 문제를 해결하지 못하면 잠자기를 추가하십시오. 진행 상황과 진행 방법에 대해 알고 계신가요? 현재 lib 종속성을 하나씩 제거하기 위해 단계별로 DLL을 단계적으로 제거 할 예정입니다. 잠시 후 작업이 시작됩니다. 필요한 경우 추가 정보를 제공해 드리겠습니다.서비스로 시작하면 LoadLibrary가 가끔 실패합니다.
0
A
답변
0
Lenovo RapidBoot Shield 앱이 이유였습니다.
"RapidBoot Shield는 중요하지 않은 응용 프로그램과 서비스를 지연시켜 시스템을보다 빠르게 부팅 할 수 있도록 지원하지만 RapidBoot Shield는 시스템 시작에 중요한 응용 프로그램 및/또는 서비스를 지연시키는 경우가 있습니다. 시스템이 예상보다 느리게 부팅되거나 일부 응용 프로그램이 정상적으로 시작하지 못할 수 있습니다. "
서비스가 시작되기 전에 작동하는 다른 서비스에 대한 종속성을 갖는 것은 꽤 일반적인 현상입니다. Windows, 제어판 + 관리 서비스의 명시 적 구성이 서비스, 속성, 종속성 탭을 마우스 오른쪽 단추로 클릭하십시오. 필요한 서비스를 알아 내면 그 질문에서 추측 할 수 없습니다. 물론 시행 착오로 발견 될 수 있습니다. 비슷한 일을하는 다른 서비스의 의존성을 살펴보십시오. –
예, 서비스 순서가 변경되기 때문에 10 가지 경우 중 하나에서 아직 시작되지 않은 종속성이 필요할 수도 있습니다. 하지만 15 초의 수면 (물론 좋은 해결책은 아니지만)이 도움이 될 것입니다. 그러나 그렇지 않았습니다. 함수를 호출하지 않고 DLL 라이브러리를로드하면 어떤 서비스 종속성이 필요한지 말할 수 없습니다. 정적으로로드하기 위해 동작을 변경할 수도 있습니다. 아마도 서비스 로그 나 그 밖의 것을 더 알려줄 것입니다. – Martin
여기서 문제가되는 DLL에 대한 추가 라이브러리 의존성을 확인할 수 있습니다. kernel32.lib, user32.lib, gdi32.lib, winspool.lib, shell32.lib 등의 서비스가 제대로로드 될 때까지 기다려야합니다. ; ole32.lib; oleaut32.lib; uuid.lib; comdlg32.lib; advapi32.lib; secur32.lib; ws2_32.lib; libeay32.lib; icuin.lib; icuuc.lib; zlibstatic.lib – Martin