2010-03-17 3 views
1

나는 수정 된 파일을 잡고 저장소에 다시 넣어 필요가 저장 한 후, 을 일부 문서를 편집 할 수 MS 워드 자동화를 사용하여 응용 프로그램과 가까운 단어이 거기에 내가이 일을 얻을 수없는 하나 개의 시나리오와 사용자가 파일을 변경을 할 때 그 입니다, 단어를 닫 선택하고 파일을 저장하려면 예를 선택MS 워드 자동화 :이 저장된 후 파일 내용을 가져

2 이벤트가 있습니다 그 나는 다음을 사용하고있다 : DocumentBeforeSave 종료

Quit 이벤트에 디스크에서 .docx 파일을로드하려고하지만 파일이 여전히 사용 중이므로이 특정 시나리오에서 IOException이 발생합니다. Quit 이벤트가 처리 된 후까지 기다려야합니다. 말씀이 실제로 폐쇄없고 파일이 더 이상 나는 그것이이 아주 못생긴 작동하는 동안이

 word.Visible = true; 
     while (!wordDone) { //gets changed to true on the Quit event 
      System.Threading.Thread.Sleep(100); 
     } 
     bool error = false; 
     do { 
      try { //need to load the contents of the modified file 
       ls.Content = System.IO.File.ReadAllBytes(provider.GetFileName()); 
       error = false; 
      } 
      catch (System.IO.IOException) { 
       error = true; 
       System.Threading.Thread.Sleep(200); 
      } 
     } while (error); 

를 사용하여 작업이 지금

을 사용할 때, 나는 방법에 필요 종료 이벤트가 처리 된 후에 이벤트를 발생 시키거나 단어가 아직 실행되는 동안 현재 스레드를 차단합니다. 문서를 저장 한 후 이벤트가 발생하면 최종선은 입니다. 파일을 저장하고 단어를 닫은 후 파일을로드하려면 깨끗한 방법이 필요합니다.. DocumentAfterSave는 굉장 하겠지만 존재하지 않는 것 같습니다.

차이

나는 또한으로 ManualResetEvent의 사용 또는 관련 클래스를 조사하고 있습니다를하지

나는 또한이 핸들러를 종료 unhooking과 종료 핸들러에 word.Quit를 호출했는데, 지금까지 거의 작동하지만 단어가 닫혀 있고 파일이 더 이상 사용되지 않는지 확인하기 위해 신호를 보낸 후에도 일시 중지해야합니다.

답변

2

나는 비슷한 문제에 직면했다. 나는 거기에 어떤 좋은 깨끗한 방법이 대신하는 방법이 고려에 대해, 당신 위와 같이 그 일의 즉시 프로세스 ID를 가져옵니다 (당신이 통제 된 환경이있는 경우에 적합합니다)

  • 하는 단어 응용 프로그램
  • 만들기 같아요 Winword와 일치하는 GetProcesses를 사용하고 목록에서 마지막 반환 값은 사용자가 지정한 값이어야합니다. 이것은 다중 사용자 환경에서 100 % 신뢰성이 없습니다.
  • 단어 종료 후에 Thread.Sleep 루프를 사용하여 PID가 더 이상 존재하지 않게하십시오. 또한 예기치 않은 예외를 잡을 때 자신 뒤처리를 기억 :
  • 사용자 정의 작업 보조 노트에
+0

실제로 필요한 코드로 작업 했으므로 작업 코드를 약간 게시 할 것입니다. – BlackTigerX

+0

그리고 나서 사용자가 동일한 Word 인스턴스에서 열리는 다른 Word 문서를 열고 사용자가 파일을 닫을 때 Word가 종료되지 않습니다. –

+0

사실,이 솔루션은 작동하지만 사용자가 실제로 Word 인스턴스를 닫을 경우에만 작동한다는 점에 유의해야합니다. 그러나 모든 것이 "풀려났다"는 것을 확인한 유일한 안전한 방법입니다. – Almund

1

이전에는 같은 문제가있었습니다. 모든 COM 관련 개체에서 ReleaseComObject를 사용하면 트릭이 수행됩니다 (즉, Word 문서 개체와 Word.Application 개체). 그렇게하면 COM 객체가 삭제 된 후에 모든 더티 잠금이 제거됩니다. Interop API로 문서와 응용 프로그램을 닫습니다. 나는 다음과 같이 사용한다 :

var localWordapp = new Word.Application(); 
    localWordapp.Visible = false; 
    Word.Document doc = null; 
    // ... 
    if (doc != null) 
    { 
     doc.Close(); 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(doc); 
    } 
    localWordapp.Quit(); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(localWordapp); 
+0

의 DOCX 읽기. 그렇지 않으면 WINWORD.EXE 인스턴스가 메모리에 떠있게됩니다. 그리고 그것은 재미 있지 않습니다. – aoj

+0

단어가 닫히는 것을 프로그래밍 방식으로 제어 할 수 없습니다. 사용자 동작입니다. Quit 이벤트에 대한 알림을 수신합니다. – BlackTigerX

+0

어디에서 doc.Close()를 호출해야합니까? 내 Quit 이벤트 처리기에 넣고 못생긴 예외가 발생했습니다 – BlackTigerX

관련 문제