#電子のブログ

道具とお金で、人生の手間を減らす

【初心者向け】dllhost.exe(COM Surrogate)とは何をしているプロセス?

今回のよくわからない exe シリーズは、dllhost.exe です。
このプロセスも、タスク マネージャーでよく見かけるプロセスです。

初心者の方はこのプロセスについて

「ウィルスではないのか?」
「たくさん動いているけど危なくないの?」

と不安になるかと思います。

結論から言いますと、dllhost.exe はたくさん起動していても不自然ではないプロセスで、ウィルスではありません。
ただ、具体的に何をしているのかは dllhost.exe という情報だけではわからず、動いているものをしっかり確認する必要があるプロセスです。
(svchost.exe と似たイメージ)

dllhost.exe とは

Dllhost.exe は、その名前の通りです。
DLL というものを host するプログラムです。
だからdllhost.exe です。
※ 別名 COM Surrogate

この説明、どこかで見ませんでしたか?
そう。svchost.exe と同じ説明です。

www.free-denshi.life

svchost.exe が「サービスの器」なのに対し、dllhost.exe は「特定の機能(DLL)を安全に実行するための代理役」と考えると分かりやすいでしょう。

以上! で終わってしまうと結局よくわからないですね。

  • dll とは何か
  • 別名の COM Surrogate とは何か
  • dllhost.exe が何の役に立つのか

を順を追って解説します。


dll ってなぁに?

それでは dllhost.exe がホストしている DLL とはなんでしょうか。
DLL は (Dynamic Link Library) の略称です。

簡単に言うと、DLL とはプログラムのパーツです。
複数のプログラムが同じ処理をするとき、パーツを切り出さないと以下のようなことが発生します。

  • プログラムごとでその処理をコーディングするからプログラムを作るのに時間がかかるし
  • プログラム側のリソースを使うので同じ処理をするものが多ければ多いほど無駄が生じる

そのため、よく使う処理は DLL というものに記述して、各プログラムがそれを参照することで同じ作業をしてもらうというもの。

仕事でも 1 回ずつ違う人に同じ説明して仕事してもらうより、手順書置いておいて 「必要ならこれ読んでね」 って対応する方が楽ですよね?
DLL とはざっくり言うとこの手順書の役割です。
手順書を作ったから自動的にその仕事が終わるわけじゃなくて、手順書通りに作業する人が必要ですよね?
それと同じで、DLL はそれ単体では動くことができず、なにかのプログラムによって動かされる必要があるのです。



COM Surrogate という名前

dllhost.exe は COM Surrogate とも呼ばれます。
COM (Component Object Model) は初心者に対しての説明が非常に難しいので、ここでは異なるプログラミング言語や開発環境で作成されたプログラムをつなぐために定められた約束とでも認識してください。

COM Surrogate は文字通り、COM という約束のもとで動く DLL の読み込みを Surrogate (代理) します。

要は 本当は他のプロセスで実行しなければならない dll を COM Surrogate (dllhost.exe) が代わりに実行してくれる ということです。
実行された dllhost.exe と本来 DLL を実行したかったプログラムについては COM の約束に則ってプロセス間通信を行います。



dllhost.exe (COM Surrogate) で DLL を実行する意味

ここまでの話を理解した方はきっとこう思うはず。
「dllhost.exe で実行しないで元のプロセスが仕事して自分で実行すればいいじゃん。」 と……

その考えは正しいです。
元のプロセス内で DLL を呼び出せばその機能は使えます。

ですが、dllhost.exe に DLL を読み込んでもらうことにはちゃんと意味があるのです。
その要因は大きく分けて 2 つあります。

1 つは 「リソースの節約」、もう 1 つは 「分離」 という考え方です。


リソースの節約

※ 実際には、dllhost.exe の主な目的は後述の "分離" であり、リソース面のメリットは副次的な効果と考えるとより正確です。

先ほどの復習をしますと、DLL は処理が記述されたもので、プログラムがそれを読み込んで使うというもの。
この機能が役に立つ場面とは、「よく使う機能」 を作る時ですね。

従って、基本的に DLL に記述された処理はよく使われますし、たくさんのプログラムがロードします。
同じ DLL をたくさんのプログラムでロードしていたら、その分のリソース消費が多くなってしまいます。

そのため、代表して dllhost.exe が DLL を読み込んで、COM という、色々なプログラミング言語で作られたプログラムでも理解できるルールに従った通信方式で通信を行って処理を代行します。
※ 実際には、すべての DLL を dllhost.exe が常に代表して読み込むわけではなく、安定性や分離が必要な COM コンポーネントに対して代理実行が行われます。

先ほどの手順書の例で言うと、

「A さん (dllhost.exe) が手順書を見ているんだから、手順書を必要部数刷って配って読み込んで理解してもらうんじゃなくて、この手順書に書いてある作業はもう全部 A さんに依頼してしまおう。」
「外国人からの依頼もあるかもだし、使用言語は英語ね」

という感じでしょうか。


分離

svchost.exe の説明でも分離という言葉が出てきました。
dllhost.exe も同じ意味合いで、機能の分離を行うというメリットがあります。

なぜ機能を分離することがメリットになるのか。

まずは先ほどの疑問の通り、元のプロセスが DLL を読み込んだ場合を想定しましょう。
DLL に記述されている処理はよく使う機能だ、ということは前項で説明しました。

頻繁に使う機能ということは、万が一のタイミング問題で都合悪くその処理で異常終了してしまう可能性があるかもしれません。
もしかしたら読み込んだ DLL の作りがイマイチで、プログラムが異常終了してしまうかもしれません。
そうなってしまうと、問題の DLL を読み込んだ、元のプロセスが異常終了してしまいます。

一方で、そのような問題が発生した DLL を dllhost.exe が読み込んでいた場合はどうなるか。

読み込んだプロセスが異常終了するので、結果として dllhost.exe が異常終了します。
となると……その機能を使いたかった元のプロセスは異常終了せずに動き続けられます。

これが DLL を分離することのメリットです。

手順書の例で言うと、手順書が破損するとみんなの作業の手が止まってしまうところ、A さんの仕事だけが止まるので会社としては動き続けられる、という感じでしょうか。
自分で考えておいてアレですが、A さん不憫すぎる……



まとめ

dllhost.exe は DLL というプログラムの処理が書かれたパーツをホストするものであり、複数起動していても問題ないプロセスです。
Windows のシステム プログラムであるため dllhost.exe 自体はウィルスではありませんし、処理の内容は読み込んだ DLL に依存するため、dllhost.exe 自体が悪いプログラムだとは言い難い存在です。

dllhost.exe が DLL を読み込むメリットとしては、リソースの節約や、機能を分離してプログラムの安定性を向上することにあります。


本ブログでは、Windows でよく見かけるけどよくわからないプログラムをなるべくわかりやすく解説しています。
少し登場した svchost.exe なども解説していますので、ぜひそのほかのものも見て行っていただけると嬉しいです。

www.free-denshi.life

Windows のサービスについても同じく解説を行っていますので、サービスが気になる場合はこちらから。

www.free-denshi.life