.NET (C#) 프로세스 및 Adobe Acrobat
-
19-09-2019 - |
문제
좋아, 여기 거래가 ...
.NET 2.0 (c#)에는 Windows (XP) 프로그램이있어 사용자가 주어진 .pdf 파일의 이름을 바꿀 수 있습니다. (파일 이름은 파일 자체의 내용에 대한 간단한 정보를 설명하므로 "구조적으로 설명 적입니다"입니다.) 프로그램의 유일한 형태에는 사용자가 .pdf 자체를 열 수 있도록 링크 라벨 객체가 있습니다. 그들이 이름을 바꾸는 것.
속임수는 사용자가 적절한 변경을하고 "저장"버튼을 클릭하면 .pdf가 닫히고, 저장이 수행되고, "다음"파일을 검색하고, 새로운 창 즉시 다음 파일을 표시합니다.
관련 코드 스 니펫은 다음과 같습니다.
private void OpenViewer()
{
// NOTE: pdfView is of type Process, in case you're not familiar with
// Process.Start().
pdfView = System.Diagnostics.Process.Start(lnkFile.Links[0].LinkData.ToString());
}
private bool KillViewer()
{
bool result = (pdfView != null);
if (pdfView != null)
{
pdfView.CloseMainWindow();
pdfView.Close();
pdfView.Dispose();
pdfView = null;
GC.Collect();
// Verify that the lock is available before you return, as returning basically says:
// "Yup, the file's available."
bool locked = false;
StreamWriter sw = null;
do
{
try
{
sw = new StreamWriter(new FileStream(lnkFile.Links[0].LinkData.ToString(), FileMode.Open));
locked = false;
}
catch (Exception)
{
locked = true;
}
} while (locked);
sw.Dispose();
}
return result;
}
private void SomeButtonEvent
{
// Record whether a viewer was open in the first place.
bool viewerActive = KillViewer();
PerformFileLockingMethod();
GetNextFile()
if(viewerActive)
{
OpenViewer();
}
}
PDF 뷰어가 잠금 장치를 완전히 해제 한 후까지 프로그램이 작업 파일의 이름을 바꾸려고 시도하지 않도록 기본적으로 잠금 고무 루프가 있음을 KillViewer ()에 알려주십시오.
문제는 이것입니다. 때로는이 모든 것이 아름답게 작동하며 때로는 killviewer가 CloseMainWindow () 호출에서 분류됩니다. 두 가지가 아니라면 이것은 상당히 간단 할 것입니다 ...
1 : pdfview.hasexited = true
그리고
2: Darned PDF 뷰어는 여전히 열려 있습니다 !!!
세상에서 어떻게 가능합니까? 창을 닫기 위해 사용해야하는 프로세스 명령이 있습니까? FYI, 프로그램은 어느 시스템 외부에서도 언급하지 않습니다.* 네임 스페이스 또는 궁극적으로 시스템 만 참조하는 내부적으로 구축 된 클래스.*.
감사.
해결책 2
추가 조사 후, 나는 무슨 일이 일어나고 있는지 결정했다고 생각합니다.
상황을 안정적으로 복제 할 수 없었기 때문에 워크 플로 세부 정보를 자세히 설명하지 않았습니다. 추가 시도 후, 나는 두 가지 신뢰할 수있는 상황을 발견했습니다 ...
- 링크를 여러 번 클릭 한 다음 저장을 클릭하십시오.
- 링크를 클릭하고 뷰어 창을 닫고 저장을 클릭하십시오.
이러한 각 경우에, 문제는 PDFViewer가 사용자가 수행 한 작업과 동기화되지 않도록 지적한 프로세스로 요약되었습니다.
링크가 여러 번 클릭되면 활성 뷰어는 PDFViewer의 프로세스와 연결되지 않은 프로세스에 있으므로 위에서 설명한 것처럼 보이는 상황이 나타납니다.
링크를 클릭하고 창이 닫히면 pdfviewer 변수가 남아있어 hasexited = true로 프로세스가 남습니다.
이 모든 것에 대한 집으로의 수업은 다음과 같습니다. 기본 사용자 인터페이스와 별도의 프로세스를 실행하는 경우 외부 프로세스에서 발생할 수있는 모든 상황을 충족 시키도록하십시오.
기록상 Nick Guerrera는 프로세스 ID로 나를 지시 할 자격이 있습니다. 그것은 궁극적으로 그것을 해결했습니다.
다른 팁
대신 시도해보세요 ..
pdfView.Kill();
pdfView.WaitForExit();