En savoir plus sur COM (Component Object Model) en douceur Partie 2 Est-il vraiment indépendant du langage?

Dernière fois

Introduction de la partie 1 Puisqu'il s'agit d'une édition introductive, mettons de côté la théorie et essayons d'utiliser COM. Je l'ai fait.

Cette fois, en mettant l'accent sur le fait que COM est «** indépendant d'un langage spécifique **» Je voudrais appeler COM dans différentes langues.

Tout ce que vous avez à faire est de démarrer IE, comme la dernière fois.

PHP

ComTest.php


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

Seulement ça. La méthode d'appel est presque la même que VBS.

Puisque la classe COM est préparée à l'avance en PHP, aucun package supplémentaire n'est requis. http://php.net/manual/ja/class.com.php

Python

ComTest.py


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

C'est presque la même chose. Cependant, la fonction d'appel COM n'est pas incluse par défaut, vous devez donc l'installer en plus. 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;
        }
    }
}

Pour utiliser des classes et des interfaces dans l'espace de noms SHDDocVw Vous devez ajouter «Microsoft Internet Controls» à la référence.

Vous pouvez l'ajouter depuis Reference Manager => COM => Type Library.

Quelques documents Microsoft sur les bibliothèques de types Je n'ai pas pu le trouver, mais à la suite de plusieurs endroits recherchés sur Google, En bref, cela semble être un fichier dans lequel les définitions d'interface COM sont écrites.

En utilisant cela, l'interface publiée sur COM Vous pouvez l'utiliser comme "type" de l'appelant.

Étant donné que les exemples d'implémentation VBS, PHP et Python génèrent des objets à partir de chaînes de caractères, Le mécanisme ici semble être différent.

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

La méthode d'implémentation est la même pour VB.NET, un langage frère de 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;
}

Je charge la bibliothèque de types à l'aide de la directive \ #import. https://msdn.microsoft.com/ja-jp/library/8etzzkb6.aspx

Cela vous permet d'utiliser des classes et des interfaces uniques, tout comme C # et VB.NET. Cependant, le code est un peu plus compliqué que C # ou VB.NET.

Tout d'abord, vous devez initialiser COM avant de l'utiliser, après l'avoir utilisé et pour le désinitialiser. (CoInitialize(), CoUninitialize())

IWebBrowser2Ptr est un pointeur intelligent pour l'interface IWebBrowser. Il semble utiliser des pointeurs intelligents au lieu d'utiliser directement IWebBrowser. (Il semble que vous puissiez le faire sans l'utiliser, mais cela n'a pas été étudié)

En outre, si CoUninitialize () est exécuté avec l'objet COM non ouvert, une erreur se produit. En creusant une étape de la portée locale J'essaye de libérer IWebBrowser2Ptr avant d'appeler CoUninitialize ().

CoCreateInstance () crée un objet réel, mais il a de nombreux arguments. https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms686615(v=vs.85).aspx

rclsid => identifiant de classe pUnkOuter => Il semble qu'il n'y ait pas de problème avec NULL pour le moment (non enquêté) dwClsContext => Il ne semble y avoir aucun problème avec CLSCTX_LOCAL_SERVER pour le moment (non étudié) riid => ID d'interface

Je ne suis pas sûr des deuxième et troisième arguments, Si je peux me le permettre à l'avenir, je peux enquêter correctement.

Il y a beaucoup de choses que je ne comprends pas bien. Je suppose que la raison pour laquelle je ne comprends pas vraiment beaucoup C ++ est qu'il a une implémentation plus COM. (Il s'enroule bien dans d'autres langues, vous devez donc implémenter correctement la partie invisible)

Le but de ce temps est "de l'utiliser pour le moment", donc je vais passer par les parties difficiles une fois.

Résumé

Il y avait quelques modèles dans la méthode de mise en œuvre, J'ai pu confirmer qu'il peut être implémenté dans différentes langues.

la prochaine fois

Partie 3 Implémentation du composant COM La prochaine fois, je me suis concentré sur le "côté appel", Je voudrais enfin faire un "appelant".

Recommended Posts

En savoir plus sur COM (Component Object Model) en douceur Partie 2 Est-il vraiment indépendant du langage?
Est-ce que ça va avec un tel patch? (Mémo sur le simulacre ~ Partie 2 ~)