2012년 8월 16일 목요일

MS Office Interop를 이용해서 개발한 Windows Service가 정상적으로 작동하지 않을 때..

  • 환경 : Microsoft Office 2010, Visual Studio 2010, Windows 7, Windows 2008 Server
  • 개요 : MS Office 2010 Interop (14version)을 이용해서 Powerpoint, Word, Excel 파일을
    PDF로 변환하는 Windows Service Program을 개발하여 포팅하였으나 Program이 정상적으로 구동되지 않았다.
  • 증상
    1. 변환 프로그램을 개발하는 Visual Studio 2010에서 Test Program인 Console Application으로 작동을 시켜보면 정상적으로 Program이 기동되었다.
    2. 1의 테스트를 확인하고 Windows Service로 배포하는 프로젝트를 생성하여 정상적으로 Windows Service에등록이 된 것을 확인하고, 구동을 시켜보니 정상적으로 작동하지 않았다.
    3. Program에서 작동하는 로그을 확인해 보니,
      "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."라는 메세지와
      "'C:\temp\document\7.xlsx' 파일을 사용할 수 없습니다. 원인은 다음과 같습니다
      해당 파일 이름이나 경로가 없습니다. 다른 프로그램에서 파일을 사용하고 있습니다.저장하려고 하는 통합 문서 이름이 현재 열려 있는 통합 문서의 이름과 같습니다."라는 메세지가 표시되었다.
    4. Excel -> PDF, PPT -> PDF, Word -> PDF 모듈이 작동하지 않았다.
  • 원인 분석
    1. Windows 7, Vista, Windows Server 2008에서 Windows Service는 Session0라고 불리는 session (or something)에서 구동이 된다. Session0는 Desktop에서 구동되는 프로그램에 접근이 불가능한 영역(Desktop-less wasteland)인데 개발된 Windows Service는 Desktop Session에서 구동되는(Desktop-ed session) Office Program인 관계로 Windows Service가 정상적으로 작동되지 않았던 것이다.
      (참고 URL : http://stackoverflow.com/questions/241190/vista-office-interop-not-working)
  • 처리 방안
    1. 첫 번째 처리 내용 : System Profile을 위한 desktop folder를 생성한다.
      이 방법은 msdn에서 확인한 방법으로서 H.Ogawa가 제시한 방법이다
      http://social.msdn.microsoft.com/Forums/en/innovateonoffice/thread/b81a3c4e-62db-488b-af06-44421818ef91

      아래의 경로에서 볼 수 있듯이 systemprofile이라는 폴더에 Desktop이라는 폴더를 만들고 해당 폴더 권한에 Everyone을 추가하고 모든 권한을 주면 된다.

      c:\Windows\SysWOW64\config\systemprofile\Desktop, or
      c:\Windows\System32\config\systemprofile\Desktop

      개발된 Windows Service 프로그램이 64bit로 빌드하였으면 SysWOW64에 Desktop을 등록하고 그렇지 않으면 System32에 등록하면 된다.

      => 처리 후 테스트 결과 : Excel, Word는 모두 정상적으로 작동을 하였으나 Powerpoint는 여전히 동작하지 않았다. 그래서 아래의 처리 방식을 추가로 처리하였다.
    2. 두 번째 처리 내용 : 1의 방법에도 여전히 Powerpoint가 구동되지 않았다.
      Powerpoint가 구동되기 위해서는 User Profile 정보가 필요한데 Windows Service로 구동을 하다 보니 충분한 User Profile 정보를 가져올 수 없어서 에러가 발생했던 것이다. (참고 URL : http://stackoverflow.com/questions/729609/powerpoint-interop-fails-in-a-windows-service-but-works-fine-in-a-windows-form-a)

      이에 대한 처리를 위해서, Windows Service에 등록되어 있는 Program의 속성 창에서 "로그온(Logon)" Tab을 클릭하여 "서비스와 데스크톱 상호 작용 허용"을 선택하면 Powerpoint도 이상 없이 구동된다.

    3. 추가 사항 : 1과 2의 방식을 통해서 Windows Service가 정상적으로 구동이 되었더니 다음과 같은 화면이 자꾸 표시되는 현상이 발생을 하였다.



      Windows Service가 구동되는 Session0에서 Word, Powerpoint등의 프로그램이 메세지를 발생시켜서 위의 화면이 표시되는 것으로 추측이 되었다.

      위의 메세지를 발생시키는 것은 다른 Windows Service에 의한 것으로서 Service 이름은 "Interactive Services Detection"이다. 해당 서비스는 "대화형 서비스에 대한 사용자 입력의 사용자 알림을 사용할 수 있도록 하는 서비스"로서 해당 서비스를 사용하지 않도록 Service 설정을 하면(사용안함으로 설정)된다.



댓글 5개:

  1. 와우 해결됐어요. 넘 감사합니다. 출처 밝히고 퍼갈게요^^

    답글삭제
  2. 작성자가 댓글을 삭제했습니다.

    답글삭제
    답글
    1. 문제 해결에 큰 도움이 되었습니다. 감사합니다 ^^

      삭제
  3. 와우, 감사합니다.
    덕분에 해결했네요.

    답글삭제
  4. 감사합니다ㅠㅠ 이 글이 저를 살렸습니다.

    답글삭제