C#에서 PowerPoint를 제어하는 불행한 당신에게
개시하다
어떤 작업 때문에 파워(슬라이드 상영)를 제어하는 궁지에 몰렸고, 처음에는 루비(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
}
);
예?정말?그래서 얼마 전에 이 기사를 발견했는데 흥미가 없어서 이식은 내버려뒀어요.
두 가지 문제가 있습니다.
InvokeMember
로 접근해야 하기 때문에 상술한 것처럼 이해하기 어려운 문법이다.Type.Missing
가 필요합니까?1 루비가 쓴 글을 이식하는 것은 이런 사람들의 나쁜 기록에 싫기 때문에 가능한 한 아래의 조수반을 했다.
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 실장 포장류를 만들면 행복하지만, 실제 프로그램에서는 대상의 생성과 폐기가 다른 방법으로 나뉘어 포장류를 만들지 않았다.
총결산
InvokeMember
속성과 방법을 호출할 수 있습니다.SAN 값이 낮아지면 지원 클래스 또는 래치 클래스를 만드는 것이 좋습니다.Reference
이 문제에 관하여(C#에서 PowerPoint를 제어하는 불행한 당신에게), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/junjis0203/items/387f48d43624c4aeea37텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)