Пытается использовать Microsoft.Office.Interop.PowerPoint для открытия файлов PPT и сохранения в виде PDF (или других типов файлов) для больших пакетных заданий. Отлично работает с файлами, у которых нет пароля. С файлами, у которых есть пароль, который я никогда не знаю, я просто хочу изящно потерпеть неудачу. Тем не менее, PowerPoint откроет диалоговое окно, и даже когда мой код прервет нисходящий поток, этот поток я не могу использовать PowerPoint до тех пор, пока это приглашение не будет закрыто вручную, и дальнейшая обработка других файлов будет заблокирована.Невозможно изящно прервать неизвестный пароль через Microsoft.Office.Interop.PowerPoint?
Предложения?
Основа моего кода выглядит следующим образом:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Threading;
using Microsoft.Office;
using Microsoft.Office.Interop.PowerPoint;
using MT = Microsoft.Office.Core.MsoTriState;
namespace PowerPointConverter
{
public class PowerPointConverter : IDisposable
{
Application app;
public PowerPointConverter()
{
app = new Microsoft.Office.Interop.PowerPoint.Application();
app.DisplayAlerts = PpAlertLevel.ppAlertsNone;
app.ShowWindowsInTaskbar = MT.msoFalse;
app.WindowState = PpWindowState.ppWindowMinimized;
}
public bool ConvertToPDF(FileInfo sourceFile, DirectoryInfo destDir)
{
bool success = true;
FileInfo destFile = new FileInfo(destDir.Name + "\\" +
Path.GetFileNameWithoutExtension(sourceFile.Name) + ".pdf");
Thread pptThread = new Thread(delegate()
{
try
{
Presentation ppt = null;
ppt = app.Presentations.Open(sourceFile.FullName, MT.msoTrue, MT.msoTrue, MT.msoFalse);
ppt.SaveAs(destFile.FullName, PpSaveAsFileType.ppSaveAsPDF, MT.msoFalse);
ppt.Close();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(ppt);
}
catch (System.Runtime.InteropServices.COMException comEx)
{
success = false;
}
});
pptThread.Start();
if (!pptThread.Join(20000))
{
pptThread.Abort();
success = false;
}
return success;
}
public void Dispose()
{
Thread appThread = new Thread(delegate()
{
try
{
if (null != app)
{
app.Quit();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(app);
}
}
catch (System.Runtime.InteropServices.COMException) { }
});
appThread.Start();
if (!appThread.Join(10000))
{
appThread.Abort();
}
}
}
}
Вы можете отправить сообщение WM_CLOSE во всплывающее окно PowerPoint после ожидания разумного промежутка времени; что, вероятно, вынудит его отменить. – RogerN