1

作成中のアドインで PowerPoint ファイルを保存する際に問題が発生しています。

基本的に、現在開いているプレゼンテーションを wmv として保存し、それを FTP で外部サーバーに転送する必要があります...簡単ですね。

現在開いているプレゼンテーションを wmv として保存する方法を考え出しました。

また、ファイルが開いているかどうかを確認するコードもあるので、「保存」プロセスがいつ完了したかがわかります。

しかし、コードは無限ループに陥ります。wmv は書き込みを開始しますが、0kb を超えることはありません。

行を削除すると

checkfile(exportPath, exportName);

それは問題なく動作します...そうでなければ、ループにとどまります。

これは私がこれまでに持っているコードです...

using System;
using System.Windows.Forms;
using Office = Microsoft.Office.Core;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using System.IO;

namespace PowerPointAddIn2
{
public partial class LoginPanel : UserControl
{
    public LoginPanel()
    {
        InitializeComponent();
    }

    private void LoginPanel_Load(object sender, EventArgs e)
    {

    }

    private void btnLogin_Click(object sender, EventArgs e)
    {

        string exportName = "video_of_presentation";
        string exportPath = @"C:\{0}.wmv";

        // Export the currently open presentation
        PowerPoint.Application ppApplication = null;
        ppApplication = new PowerPoint.Application();
        ppApplication.Activate();
        ppApplication.ActivePresentation.SaveAs(String.Format(exportPath, exportName), PowerPoint.PpSaveAsFileType.ppSaveAsWMV, Office.MsoTriState.msoTrue);

        checkfile(exportPath, exportName);

        MessageBox.Show("Finished");

    }

    protected void checkfile(string exportPath, string exportName)
    {
        FileInfo f = new FileInfo(String.Format(exportPath, exportName));
        while (IsFileLocked(f) == true) { System.Threading.Thread.Sleep(5000); }
        MessageBox.Show("Finished");
    }

    protected virtual bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;

        try
        {
            stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        }
        catch (IOException)
        {
            //the file is unavailable because it is:
            //still being written to
            //or being processed by another thread
            //or does not exist (has already been processed)
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }

        //file is not locked
        return false;
    }

}

}

私が投稿した以前のスレッドに基づいて、 Thread.Join() を試して、続行する前に保存スレッドが終了するのを待つことができるかどうかを確認しましたが、ファイルの保存中に一時停止しなかったため、最終的に同じ結果です。

ヘルプ/ポインターは大歓迎です。

ありがとう

4

1 に答える 1

1

PowerPoint Application オブジェクトには、これに必要な情報を返す ppMediaTaskStatus プロパティがあります。PPT VBA IDE のオブジェクト ブラウザを使用して、さまざまな値を取得できます。

于 2013-07-12T16:54:20.710 に答える