C#에서 PowerPoint를 제어하는 불행한 당신에게

15048 단어 COMOleC#
나야
개시하다
어떤 작업 때문에 파워(슬라이드 상영)를 제어하는 궁지에 몰렸고, 처음에는 루비(Win32 OLE)가 썼다가 C#로 다른 프로그램을 써야 했고, 파워포 제어기만 루비라고 생각해 C#에 이식했다.어렵기 때문에, 나는 그 지식을 쓴다.또한 C#은 상세하지 않습니다.
기초 지식
Windows로 다른 애플리케이션을 제어하는 것은 어떤 언어를 사용하든 OLE입니다.
라벨에 글을 쓰는 사람이 없어요...멸망한 기술인가?
나도 OLE와 COM 중 어느 것이 예로부터 있었던 용어인지 모르겠다.아무튼 앞으로 콤으로
C#를 통해 COM 객체 제어
그래서 "C#OLE"로 투덜댔어요.이것은 나의 보도다.
https://fornext1119.hatenablog.com/entry/20120328/p3
부분 참조(줄 바꿈 등 부분 수정)
//ワークブックコレクションオブジェクトを生成する。
object excelBooks = excelApp.GetType().InvokeMember(
    "Workbooks", BindingFlags.GetProperty, null, excelApp, null
);

//Excelファイルのオープン
object excelBook = excelBooks.GetType().InvokeMember(
    "Open", BindingFlags.InvokeMethod, null, excelBooks,
    new object[]{
        strMacroPath,
        System.Type.Missing, System.Type.Missing, System.Type.Missing,
        System.Type.Missing, System.Type.Missing, System.Type.Missing,
        System.Type.Missing, System.Type.Missing, System.Type.Missing,
        System.Type.Missing, System.Type.Missing, System.Type.Missing
    }
);
예?정말?
그래서 얼마 전에 이 기사를 발견했는데 흥미가 없어서 이식은 내버려뒀어요.
두 가지 문제가 있습니다.
  • COM 대상의 속성과 방법은 InvokeMember로 접근해야 하기 때문에 상술한 것처럼 이해하기 어려운 문법이다.
  • '미지정 매개 변수'에 대해서도 교부Type.Missing가 필요합니까?1
  • Assistant Level 생성
    루비가 쓴 글을 이식하는 것은 이런 사람들의 나쁜 기록에 싫기 때문에 가능한 한 아래의 조수반을 했다.
    public class OLEHelper {
        public static object createObject(string progID)
        {
            var t = Type.GetTypeFromProgID(progID);
            return Activator.CreateInstance(t);
        }
    
        public static void freeObject(object o)
        {
            Marshal.FinalReleaseComObject(o);
        }
    
        public static object getProperty(object o, string name)
        {
            return o.GetType().InvokeMember(name, BindingFlags.GetProperty, null, o, null);
        }
    
        public static void setPropery(object o, string name, object value)
        {
            o.GetType().InvokeMember(name, BindingFlags.SetProperty, null, o, new object[]{value});
        }
    
        // paramsは可変長引数
        public static object call(object o, string name, params object[] args)
        {
            return o.GetType().InvokeMember(name, BindingFlags.InvokeMethod, null, o, args);
        }
    }
    
    이 어시스턴트 클래스를 사용하면 SAN 값을 낮추지 않고 PowerPower Control 프로그램을 쓸 수 있습니다.
    평론에서 말한 바와 같이 방법을 호출할 때 매개 변수만 있으면 된다.
    class Program
    {
        static void Main(string[] args)
        {
            var path = Path.GetFullPath(@".\test.pptx");
    
            var powerpoint = OLEHelper.createObject("PowerPoint.Application");
            var presentations = OLEHelper.getProperty(powerpoint, "Presentations");
            // Openの引数は4つあるが必要な数だけ渡すので大丈夫らしい
            var presentation = OLEHelper.call(presentations, "Open", path);
            // presentationsを解放しても開いたpresentationに影響はない
            OLEHelper.freeObject(presentations);
    
            var slideshowsettings = OLEHelper.getProperty(presentation, "SlideShowSettings");
            var slideshowwindow = OLEHelper.call(slideshowsettings, "Run");
            OLEHelper.freeObject(slideshowsettings);
    
            var slideshowview = OLEHelper.getProperty(slideshowwindow, "View");
    
            do {
                Thread.Sleep(5 * 1000);
                OLEHelper.call(slideshowview, "Next");
            } while ((int)OLEHelper.getProperty(slideshowview, "State") != 5);
    
            OLEHelper.call(powerpoint, "Quit");
    
            // オブジェクトを全部解放しないとウインドウが閉じられない
            OLEHelper.freeObject(slideshowview);
            OLEHelper.freeObject(slideshowwindow);
            OLEHelper.freeObject(presentation);
            OLEHelper.freeObject(powerpoint);
        }
    }
    
    또 다른 중요한 점은 논평에서 말한 바와 같이 모든 COM 대상을 놓지 않으면 창을 표시하거나 프로세스가 Powerpo 제어기가 끝나도 끝나지 않는다는 것이다.
    그런 점에서 원재료 보도 프로그램이 모든 대상을 방출하지 않은 것 같아서 엑셀이 잘 끝날지 좀 신경 쓰였다(원재료 프로그램이 시작되지 않았다)
    원시적인 Object가 아닌 IDisposable 실장 포장류를 만들면 행복하지만, 실제 프로그램에서는 대상의 생성과 폐기가 다른 방법으로 나뉘어 포장류를 만들지 않았다.
    총결산
  • PowerPoint와 같은 Office를 제어하려면 OLE를 사용합니다.
  • C#(또는.NET)에서 InvokeMember 속성과 방법을 호출할 수 있습니다.SAN 값이 낮아지면 지원 클래스 또는 래치 클래스를 만드는 것이 좋습니다.
  • Workbooks.Open의 참조는 여기.입니다.자세히 세어 보니 원래 15개의 매개 변수가 있었다. 

    좋은 웹페이지 즐겨찾기