[PYTHON] Erfahren Sie mehr über COM (Component Object Model) leise Teil 2 Ist es wirklich sprachunabhängig?

Letztes Mal

Teil 1 Einführung Da es sich um eine Einführungsausgabe handelt, werde ich die Theorie beiseite lassen und versuchen, COM zu verwenden. Ich habe das gemacht.

Diesmal mit dem Schwerpunkt auf der Tatsache, dass COM "** unabhängig von einer bestimmten Sprache **" ist. Ich möchte COM in verschiedenen Sprachen anrufen.

Alles, was Sie tun müssen, ist den IE zu starten, genau wie beim letzten Mal.

PHP

ComTest.php


<?php
	$ie = new COM("InternetExplorer.Application");
	$ie->Visible = true;
?>

Nur das. Die aufrufende Methode ist fast dieselbe wie bei VBS.

Da die COM-Klasse in PHP im Voraus vorbereitet wird, sind keine zusätzlichen Pakete erforderlich. http://php.net/manual/ja/class.com.php

Python

ComTest.py


import win32com.client
ie = win32com.client.Dispatch("InternetExplorer.Application")
ie.Visible = True

Das ist fast das gleiche. Die COM-Aufruffunktion ist jedoch standardmäßig nicht enthalten, sodass Sie sie zusätzlich installieren müssen. https://sourceforge.net/projects/pywin32/

C#

Program.cs


using SHDocVw;
namespace ComTestByCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            InternetExplorer ie = new InternetExplorer();
            ie.Visible = true;
        }
    }
}

So verwenden Sie Klassen und Schnittstellen im SHDDocVw-Namespace Sie müssen der Referenz "Microsoft Internet Controls" hinzufügen.

Sie können es über Reference Manager => COM => Type Library hinzufügen.

Einige Microsoft-Dokumentationen zu Typbibliotheken Ich konnte es nicht finden, aber als Ergebnis von verschiedenen Orten gegoogelt, Kurz gesagt, es scheint sich um eine Datei zu handeln, in die COM-Schnittstellendefinitionen geschrieben sind.

Auf diese Weise wird die auf COM veröffentlichte Schnittstelle Sie können es als "Typ" des Anrufers verwenden.

Da die Implementierungsbeispiele für VBS, PHP und Python Objekte aus Zeichenfolgen generieren, Der Mechanismus hier scheint anders zu sein.

VB.NET

vb.net:Module1.vb


Imports SHDocVw
Module Module1
    Sub Main()
        Dim ie As InternetExplorer = New InternetExplorer
        ie.Visible = True
    End Sub
End Module

Die Implementierungsmethode ist dieselbe für VB.NET, eine Geschwistersprache von C #.

C++

ComTest.cpp


#include "stdafx.h"
#include <atlbase.h>
#include <exdisp.h>
#import "C:\WINDOWS\system32\shdocvw.dll"
int _tmain(int argc, _TCHAR* argv[])
{
	CoInitialize(NULL);
	{
		IWebBrowser2Ptr ie;
		CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (VOID**)&ie);
		ie->put_Visible(VARIANT_TRUE);
	}
	CoUninitialize();
	return 0;
}

Ich lade die Typbibliothek mit der Direktive \ #import. https://msdn.microsoft.com/ja-jp/library/8etzzkb6.aspx

Auf diese Weise können Sie eindeutige Klassen und Schnittstellen wie C # und VB.NET verwenden. Der Code ist jedoch etwas komplizierter als C # oder VB.NET.

Zuerst müssen Sie COM vor der Verwendung und nach der Verwendung initialisieren und die Initialisierung aufheben. (CoInitialize(), CoUninitialize())

IWebBrowser2Ptr ist ein intelligenter Zeiger für die IWebBrowser-Schnittstelle. Es scheint intelligente Zeiger zu verwenden, anstatt IWebBrowser direkt zu verwenden. (Es scheint, dass Sie es tun können, ohne es zu verwenden, aber es wurde nicht untersucht)

Wenn CoUninitialize () mit ungeöffnetem COM-Objekt ausgeführt wird, tritt ein Fehler auf. Durch Graben eines Schritts des lokalen Bereichs Ich versuche, IWebBrowser2Ptr freizugeben, bevor ich CoUninitialize () aufrufe.

CoCreateInstance () erstellt ein tatsächliches Objekt, hat jedoch viele Argumente. https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms686615(v=vs.85).aspx

rclsid => Klassen-ID pUnkOuter => Es scheint, dass es vorerst kein Problem mit NULL gibt (nicht untersucht) dwClsContext => Es scheint vorerst kein Problem mit CLSCTX_LOCAL_SERVER zu geben (nicht untersucht) riid => Schnittstellen-ID

Ich bin mir über das zweite und dritte Argument nicht sicher. Wenn ich es mir in Zukunft leisten kann, kann ich es richtig untersuchen.

Es gibt viele Dinge, die ich nicht gut verstehe. Ich vermute, dass der Grund, warum ich nicht viel über C ++ verstehe, darin besteht, dass es eine COM-ähnliche Implementierung hat. (Es lässt sich gut in andere Sprachen einbinden, sodass Sie den unsichtbaren Teil ordnungsgemäß implementieren müssen.)

Der Zweck dieser Zeit ist es, "es vorerst zu benutzen", also werde ich die schwierigen Teile einmal durchgehen.

Zusammenfassung

Es gab einige Muster in der Implementierungsmethode, Ich konnte bestätigen, dass es in verschiedenen Sprachen implementiert werden kann.

nächstes Mal

Teil 3 Implementierung der COM-Komponente Das nächste Mal habe ich mich auf die "anrufende Seite" konzentriert, Ich möchte endlich einen "Anrufer" machen.

Recommended Posts

Erfahren Sie mehr über COM (Component Object Model) leise Teil 2 Ist es wirklich sprachunabhängig?
Ist es in Ordnung mit einem solchen Patch? (Memo über Mock ~ Part 2 ~)