• ベストアンサー

ActiveX DLL と ActiveXコントロールの違い

VB6で開発をしています。 複数のEXEファイルを使用するシステムです。 各EXEファイルの共通のモジュールをライブラリ化しようと思っています。 これは [ActiveX DLL] 又は、[ActiveXコントロール] のどちらでも実現できると思うんですが、どちらで作成した方が良いのでしょうか? それぞれのメリット、デミリットを教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

混乱させますw 私も最近まで知らなかったのですが、任意のタイミングでOCXもインスタンスの生成が可能みたいです。 WinSockを張らずにPGを書き上げ、WinSockコントロールを使用する方法がわたしの利用しているメーリングリストに出ておりました。 その結末は、「あまり公開はされてはいないけど、ほとんどのコントロールはEXEにしてからOCXとして取り込むことができる」ということです。 ActiveXDLLも参照設定をしなければ、DLLバージョンが違っても大丈夫です。 ただし宣言が As HogeHoge←(DLLの定義)を As Object として、CreateObject("DLL定義")のように行うと、引数が一緒ならEXEはリコンパイルしないでもいいです。実例として、エクセルを参照設定して[as Excel]と宣言していたら、その参照設定に対応したExcelしか操作できませんが、[As Object]と[CreateObject("Excel.Application")]とすると、EXCEL95~XPまで扱えます。 不便なのは、タイプライブラリが未設定になるので、Excelの各プロパティ/メソッドを知らないといけないし、Excel固有の定数が宣言もされてないので、自分で定数値を調べなければいけません。でもバージョンの違いを気にしないでいけるのは、非常に便利です。 速さのことを言ったら、当然DLLが早いです。 OCXはプロパティにRight/Leftなどを持っています。変えて言うと実体を持っていると言うことです。非表示にしていても実体をもっています。DLLはインスタンスは生成されますが、OCXだって生成されるので、表示しないで使用するなら、OCXの意味があまりありません。 んで、私(個人)の考えとしては、、、 ※オリジナルボタンなどの、画面上必要ならOCX   理由:画面に必要だから ※画面に表示を行う必要がなくても、配布する気ならOCX   理由:配布先のユーザが扱いやすい ※そうじゃなければDLL   理由:OCXにする理由が見つからないから 余談です。 私はいつもCommonコントロールは使用しません。   理由:簡単なAPIでも実現できるのに、機能が少ないCommonコントロールを追加して、EXEの容量を大きくしたくないから

reshop
質問者

お礼

ありがとうございました。 DLLにしようと思います。 あと、 >※画面に表示を行う必要がなくても、配布する気ならOCX > 理由:配布先のユーザが扱いやすい 配布先ユーザというのは、開発者のことですか?また、開発したシステム(ソフト)を使用するエンドユーザのことです?

その他の回答 (6)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.7

なんか文章を書いた後勘違いされそうな文章に思えたので、補足です。 参考URLのOCXの場合を例に挙げたのは、電源のON/OFFだけならDLLで十分だということです。ただこのOCXは他の機能により画面も要します。それらの機能のために画面が必要なので、必然的にOCXということになりますが、、、 しかし、画面がなくても配布という意味で、先ほど言った理由でOCXが望ましいということになります。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.6

このようなOCX http://www.vector.co.jp/soft/win95/prog/se185666.html このような機能は、本来はOCXでなくDLLで済むものです。 電源を管理する関数群の設定を、パラメータでなく、プロパティとして設定させることで、開発者だけでなく、そのOCXを使用する人が設定しやすくなります。 よほど汎用性が高い関数なら、OCX化して小銭稼ぎができます。

参考URL:
http://www.vector.co.jp/soft/win95/prog/se185666.html
  • Hk2001
  • ベストアンサー率48% (24/49)
回答No.4

ActiveXコントロールってOCX作るやつですよね? これは、画面に貼り付けないと使えません。 ActiveXDLLの方は、参照設定などを使用して宣言します。 基本的にActiveXコントロールはインターフェースがあるもの向け、 ActiveXDLLの方は通常のクラスの使い方向けです。 ActiveXDLLでもフォームなどの画面は組み込めます。 両者とも外部ファイルになるので 使用するとEXEが小さくなります。 両者ともデメリットは、世代管理(継承)管理が必要になります。 失敗すると全EXEの再コンパイルが必要です。 また インターフェース部分(パブリックの引数、関数名)など変更すると 再コンパイルが必要です。関数の追加はOKです。 作ってしまうと内部的に見えないので、 しっかり作らないとエラーを追えません。 また、セットアップを作成する場合も、両者とも内部で使ってある コントロールやオブジェクトを組み込まないと、EXEは動きません。 両者のメリットは、作成後の開発効率や、ソースの隠蔽性などですかね。 両者とも結構デメリットありますので覚悟して開発してください。

reshop
質問者

お礼

ありがとうございました。

  • k_kazari
  • ベストアンサー率68% (15/22)
回答No.3

どうもです。 戻ってみてみたら続きがありました(汗) えーーーっと DLLの処理速度が速いというのは あくまで、ActiveX.exeとの比較で言っていたので ActiveXコントロールと比較しての答えではありませんのでしたのでした。 すんません。 書籍などを見ている限り ActiveX.dllとActiveX.exeを比較して メリット・デメリットなどを述べているもので おまけで書いてみました。 でも、GUIもってるのと持ってないのと、DLLって考えたら 感覚的にで、なんも根拠ないんだけど DLLの方がなんか早そう(おいおいっ) COM化(ActiveX.dll)というのは 今制作しているプログラム(仕事上のプロジェクト)があるとして また、まったく別のプログラム(プロジェクト)でも再利用したいというときに 共通ライブラリとして 使うのだと思います。 ということで、今の仕事のプロジェクト終了後、 またいずれ先に、違うプロジェクトなどで 同じ処理を利用したりするなど そんなときにCOM化しておけばよいと思います。 とか、Webで処理速度・レスポンスを速くしたいとか。。。 が、時事的にも、 後々、開発ツールのバージョンアップやシステム環境の変化など 考慮すると、COM化しておいた方がよいような気がします。 あまり汎化されていないモジュールだったり その仕事でしか使わないような共通の処理だったら クラスモジュールの方が、よい気もしますが。 あんまし参考になってない気がしますが ・・・そんな感じです。 でわであ

reshop
質問者

お礼

ありがとうございました。

  • k_kazari
  • ベストアンサー率68% (15/22)
回答No.2

一意見ですが、上記の目的から行くと >各EXEファイルの共通のモジュールをライブラリ化しようと思っています。 ActiveX.dll もしくは ActiveX.exe が 向いているように思えます。 ActiveXコントロールは インターフェース(GUI)をもったコンポーネントです。 たとえば、ボタンや画像など、フォームごと、一緒にCOM化しちゃうものです。 ActiveX.dllは コードコンポーネントとして利用しています。 処理を分割して、ライブラリのようにして利用するのに 向いていると思います。 これはインターフェースをもちません。 たとえば、外部のEXEから 独立したActiveX.dllの関数をコールして、処理をさせたり 戻り値を受け取ったりすることができます。 メリットは、DLLなので処理速度が速い。 デメリットは、インプロセスなので、 DLLでこけると、かなりのこけかたをする (超アバウト・・・) ちなみに、 ActiveX.exe も コードコンポーネントとして利用できるのですが これは、アウトプロセスで、 DLLに比べると処理は若干遅いけど 安全性が高いとのことです。 ・・・でした なんか、参考になれば幸いです

reshop
質問者

お礼

お返事ありがとうございます。 <No.1>nanashinogonbeiさんへのお礼文を入力している間にお返事をいただいたみたいで、同じ質問をさせていただきます。 例えば、ActiveX コントロール作成時に、プロジェクト内に簡単な計算をするクラスモジュールを追加します。(UIは用意しません。タイマーコントロールみたいな感じで実行時には非表示になります。) アプリケーション側では、このクラスを使用するだけ。 この様な場合ですと、ActiveX DLLで作成したクラスを使用するのとどう違うのでしょうか? また、 >メリットは、DLLなので処理速度が速い。 というのは、上記例の場合、ActiveXコントロールよりも処理が早いという事なのでしょうか?

noname#4564
noname#4564
回答No.1

[共通点] ・どちらも単独のプロセスとして起動することはできない。 ・どちらもCOMクライアントと同一のアドレス空間?(= インプロセス)で動作するので、ActiveX EXEより高速に動作する。 (DCOMを使えばアウトプロセスで動作させることも可能??) [相違点] ・ActiveX DLLは任意のタイミングでインスタンスの生成/破棄が可能。 ・ActiveX コントロールを使用するにはコンテナが必要。 コンテナがロードされている間は破棄出来ない。 (コンテナと寿命をともにするので、任意のタイミングで生成、破棄できない) ロジックのみでUIを必要としないプログラムはActiveX DLLで、UIを必要とするプログラムはActiveX コントロール(OCX)として実装するのが一般的だと思います。 ちょっとあやふやですが、大体こんな感じでしょうか?(^^;

reshop
質問者

お礼

お返事ありがとうございます。 まだちょっと、わからないのですが。 例えば、ActiveX コントロール作成時に、プロジェクト内に簡単な計算をするクラスモジュールを追加します。(UIは用意しません。タイマーコントロールみたいな感じで実行時には非表示になります。) アプリケーション側では、このクラスを使用するだけ。 この様な場合ですと、ActiveX DLLで作成したクラスを使用するのとどう違うのでしょうか?

関連するQ&A

  • VB6.0 ExeとDllの違い

    いつもお世話になっております。 今更ながらなのですがVB6.0について質問させて下さい。 新規でVB6.0を起動すると、「標準Exe」・「ActiveXExe」・「ActiveXDll」・「ActiveXコントロール」等がでてきますよね? 普段アプリを開発する時は「標準Exe」しか使用しないのですが、「ActiveXExe」・「ActiveXDll」・「ActiveXコントロール」の違いは何なのでしょうか?(どういうときに使い分けるのでしょうか?) ActiveXDll・・・ソースコードのみ?参照設定する?(クラスやモジュールと何が違うのでしょうか?) ActiveXコントロール・・・独自のコンポーネント(部品)を作る?(OCXのようなものでしょうか?) ActiveXExe・・・(一番分かりません) どなたかご教示お願いします。

  • ACTIVEXの拡張子

    ACTIVEXについて調査しています。 ACTIVEXの拡張子にはACTIVEXコントロールであるOCX、 モジュールとして存在するDLLとEXEの3つがあると分かりました。 これ以外にも何かあるものなのでしょうか。 よろしくお願いします。

  • VC++6.0で作成されたActiveXコントロール

    まだプログラミングを始めて日が浅いため、馬鹿な質問をしていたら申し訳ありません。 現在、ActiveXコントロールを使ったプログラムを作成しております。 メインの環境がVC++2008なのですが、このActiveXコントロールがVC++6.0で作られた物であるため、VC++2008で使用しようとするとエラーが出てしまいます。 またプログラム中で使っているライブラリの中でVC++6.0で動いてくれないものもあり、私としては慣れないVC++6.0より何とかして2008でこれを使いたいのですが・・・ 一応現在はVC++6.0でこのActiveXコントロールを動作させるプログラム(以下exeと略)を作り、このexeをVC++2008のプログラム内でCreateProcess関数で呼び出すと言う方法を取っています。 引数はコマンドライン引数、処理結果はファイル経由で受け渡しをしています。 このActiveXコントロールというのがあるカメラから画像を取得するものですので、どうして処理時間の長さが気になります。 そこでプロセスの起動と終了にかかる無駄な時間を減らすため、このexeをDLL化できないものかと考えています。 前置きが長くなりましたが、私が質問したいことは (1)「VC++6.0で作られたActiveXコントロール」を使用したDLLを作れるのか?作れるのならばそれはVC++2008で使えるのか? (2)DLL化以外に処理時間を短くする方法はないか?(例えばexeを立ち上げっぱなしにしたまま引数等をメインプログラムとやり取りできないか?) の2点です。 なおこのActiveXコントロールはソースがないため、VC++2008でビルドしなおすと言う手が使えません。 よろしくお願いします。

  • ActiveXの使い方を教えてください。

    昨日も質問させていただきましたがま倒しえてください。 標準EXEまでできていてIE内に表示させるためにはActiveXコントロールで作成しないといけないのですがどのようにどんな風にすればよいのでしょうか。 全くわからないので参考になる文献やサンプルがあれば非常に助かります。 私はVB6で開発して、Inter Devも入っています。 どんなActiveXコントロールを作成したらいいのでしょう・・・ よろしくお願いいたします。

  • ActiveXの種類について

    初歩的なことをお聞きします。 ActiveX(VB6)にはDLL、Exe、コントロール(Ocx?)といった種類がありますが、 それらの用途を教えて下さい。また、これらは.netでも使用できるのでしょうか。 宜しくお願いします。

  • ssTabの上のActiveXコントロール

    VB6.0で開発しています。 sstabに3つのActiveXコントロール(OCX)を貼り付けてexeを作成しています。 しかし、初心者なため、OCX内のコントロール たとえばコマンドボタンや、コンボボックスにセットフォーカスすら 移りません。 これでは値を設定することもできません。 すみませんが、御存知の方、おしえてください。

  • .NETでActiveXコントロールを使う

    開発系初心者です。 ある事情にて.NETの環境でActiveXコントロールの使用を行うことになりました。 そこで、下記アドレスの方の方法を参考にさせていただいたのですが、 ラッパークラスライブラリの生成が行えません。 .NET環境でActiveXコントロールの実装を行うことに参考にさせていただいたサイト http://blogs.wankuma.com/ganfield/archive/2007/03/13/66556.aspx サイトに記載されているActiveXの登録には、下記のアドレスの方のを参考に、 regsvr32で登録済みとなっています。 ActiveX登録に参考にさせていただいたサイト http://www3.ocn.ne.jp/~tonko/HP13_02.htm 二つのラッパーライブラリが生成できないというのは、コマンドプロンプトの作業時、 AxImp c:\WINDOWS\system32\msdxm.ocx と、入力しても AxImp エラー: タイプ ライブラリ/DLL の読み込みエラーです。(HRESULTからの例外:0x80029C4A (TYPE_E_CANTLOADLIBRARY)) と出てしまい、ラッパーライブラリが生成できません。上記サイト以外に、何か準備する必要があるのでしょうか? なお、開発環境は、 OS     :Windows 7 開発環境 :Visual Studio 2010 です。プログラミング言語ではC#の使用を予定しています。 どなたかご回答をお願い致します。

  • mfc42.dllファイルってなんですか?

    こんにちは。 最近、プログラムの勉強をしている物ですが、例えばVBであるシステムを開発して、SetUpを作った際に、色々なプラットフォームで検証するのですが、mfc42.dllというファイルが絡んだエラーが良く出ます。 そもそも「mfc42.dll」とは何でしょうか? OSインストール時に最初から入っているものなのでしょうか? dllファイルとはダイナミックリンクライブラリの事で、OSが色んな時に使用する共通の関数が詰まっている、VBでいう標準モジュールのようなものの事ですよね?(合ってますか(^^;)?) mfc42.dllがそうなら、どういうときに使用されるのでしょうか? また、Aというソフトをインストールした後で、Bというソフトをインストールして、互いのmfc42.dllの更新日時(バージョン?)が違う場合、Bをインストールする事によってAが動かなくなる・・・というのもありえるのでしょうか?? だとしたらとても怖い事ですよね!? でもSetUp作成ソフトやVB標準のディストリビュージョンでSetUp.exeをつくると勝手にmfc42.dllが紐付かれてしまう場合が多々あります。 これを回避する方法はあるのでしょうか? どなたかご教授下さい。

  • ActiveXコントロールを作成してから登録の削除は?

    VBでActiveXコントロールを初めて作成したのですが、 間違えて同じ名前のActiveXコントロール作成してしまいました。 で、コンポーネントでのActiveXコントロール追加に同じ名前のコントロール が2登録されてしまいました。 この登録されたコントロールを2つとも削除したいのですが。 拡張子「*.ocx」のファイルを削除しても、 コンポーネントのコントロールに登録したActiveXコントロール名が残ったままです。 どうすれば、この登録を削除できるのでしょうか? よろしくお願いします。m(__)m 補足: 標準.EXEファイルなどでVBを立ち上げて、 ツールボックスの上で右クリック→コンポーネント→コントロールタブ で、表示されるコントロール名に同じコントロール名が登録されている状態です。 この登録名を両方とも削除したいのですが。

  • ActiveXコントロールの開発環境からのデバッグ方法

    VBで自作のActiveXコントロールを作成しました。 コンパイルして生成されたabcd.ocxを 自作のtest.htmファイル内に指定して、ActiveXコントロールから test.htmlに記述されたJavaScriptを制御します。 開発環境の実行を行わなわずに、test.htmをIEで表示させると、 ActiveXコントロールがダウンロードされ(すでにローカルにありますが)JavaScriptを実行することはできます。 やりたいのは、開発環境から実行させて、JavaScriptを動作させたのです。 どうすればいいのでしょうか? 環境は、VB6.0(SP5),IE5.5(SP1)です。