外から利用する場合の DLLとEXEの違いについて

解決


mel  2002-08-23 11:03:26  No: 50331  IP: [192.*.*.*]

サンプルプログラムのリンクエラーについてで助けていただいたものです。
その節はありがとうございました > YuOさん warさん

今回はVBからVC++で作ったプログラムを利用する際のスタイルの違いについて
ご存知でしたら教えていただきたいのですが、本やウェブなどを調べるとVC++
でDLLを作ってVBから呼ぶことがよく書いてあるのですが、ShellExecuteなど
からexeを呼ぶのとDLLにして呼ぶのとでは何が大きな違いになるのでしょうか?
 また、VC++で開発したプログラム(関数)をVBにまったく取り込んでコンパイル
することは不可能なのでしょうか?
変な質問で申し訳ありませんがよろしくお願いいたします。

編集 削除
Drum  2002-08-23 15:19:12  No: 50332  IP: [192.*.*.*]

お初にお目にかかります、Drumです。

melさんの質問について、漠然と答えますと、

>ShellExecuteなどからexeを呼ぶのとDLLにして呼ぶのとでは何が大きな違いになるのでしょうか?

「何かの処理をする」という意味では、同じと思います。
ですが、それぞれ出来る事と出来ない事がありますし、そもそもコンピュータ内の処理は全然異なります。

>VC++で開発したプログラム(関数)をVBにまったく取り込んでコンパイルすることは不可能なのでしょうか?

言いたい事はなんとなく分かりますが、実現するにはDLL化などしないといけません。

ここ(掲示板)で詳細を説明するのは正直無理なので、以下の観点で勉強してみてはいかかでしょうか?

・EXEファイルと、DLLファイルの違いは?
・プログラム言語から、EXEファイル(DLLファイル)が出来るまでの流れ
  (要はコンパイル処理が何をやっているのか?ってことです)
・プログラム(プロセス)とは?
・(動的・静的)リンクとは?

>変な質問で申し訳ありませんがよろしくお願いいたします。

私個人の意見ですが、全然変な質問ではないと思います。むしろ(言語を問わず)プログラムを作成する上で、基本的に知っておく必要がある所なので、今の内に勉強すべきことだと思います。(私もプログラム初心者の時に同じようなことを思ったものです。)

P.S 書籍としてこれをおすすめします。
----------------------------------------
矢沢久雄  著、日経ソフトウエア  監修
プログラムはなぜ動くのか
-知っておきたいプログラミングの基礎知識-
-----------------------------------------
VBやVC++で説明しているので、理解しやすいと思います。

編集 削除
ケンタロ〜K  2002-08-23 15:33:19  No: 50333  IP: [192.*.*.*]

> でDLLを作ってVBから呼ぶことがよく書いてあるのですが、ShellExecuteなど
> からexeを呼ぶのとDLLにして呼ぶのとでは何が大きな違いになるのでしょうか?

exeを呼ぶ場合は、自分とは別プロセスになるので、メモリ空間も別です。
大きな情報を渡したい時に、直にポインタを使えませんので、工夫が要ります。
頻繁に交信を必要とする用途には良くはないと思います。

dllを呼ぶ場合は、自分と同じプロセス内にdllが読み込まれるので、メモリ空間は同じです。
大きな情報を渡したい時に、ポインタを使えます。
頻繁かつ多量な交信をする用途には良いと思います。

>  また、VC++で開発したプログラム(関数)をVBにまったく取り込んでコンパイル
> することは不可能なのでしょうか?

VC++などで作成したDLLを、Vbで作ったEXEファイル内部に取り込み、運用するという話でしょうか?
それは無理です。
通常、DLLファイルとEXEファイルは分かれた状態で使います。
EXEのプログラムが必要とする時に、DLLがメモリ空間に取り込まれます。

> 今回はVBからVC++で作ったプログラムを利用する際のスタイルの違いについて
> ご存知でしたら教えていただきたいのですが、本やウェブなどを調べるとVC++

Vbで作るEXEからVC++で作ったDLLを呼び出す、というシナリオを考えようと思います。
方法が複数あります。

・Vb側のプログラムは、APIという形で純粋にDLLを利用する。
・Vb側のプログラムは、OLEオ〜トメ〜ション(ActiveX DLL?)という形でDLLを利用する。

前者は、VB・MS Access・MS Excel・MS Word(Visual Basic for Applicationsと呼ばれるVB搭載製品)・Win32用C言語製品などから利用できる。
性質:
・Cのような、関数として機能を提供することも、C++のような、クラス(オブジェクト)を提供することも可能(但しC/C++からしか利用できない)。
長所:
・DLL内の関数の仕様は、基本的に作った人しかわからないので、他から流用される可能性が低くなる。
・VC++などから利用したくなっても、比較的低コストで再利用できる。
短所:
・関数の仕様が分からないと、正しく利用できない。VBなどで使う場合もDECLAREで仕様を伝える必要がある。

後者は、前者の利用環境を含み、Windows Scripting Host・IE・IIS(ASP使用時)・.NET Frameworkなどからも利用できる。
性質:
・基本的にオブジェクトしか提供できない(IUnknownなど)。
長所:
・利用者はDLLの構造を考えなくて良くなる。一意なIDや名前のみでDLL内のオブジェクトを識別・作成できる。
・呼び出しに必要な情報はDLL内に入っているので、DECLAREなど、別途定義する必要がない(パフォ〜マンスを選ぶ場合、そうしないことも可能)。
・汎用的な物は再利用がきく。
・DLLサロゲ〜トで包んであると、リモ〜トコンピュ〜タ上にオブジェクトを作成して操作できる。
短所:
・DLLはCOMの仕様にそって作成されなければならない(これは非常に面倒な作業だが、VC++などではウィザ〜ドの助けを借りると楽に作成できる。また、Vbでもこの種のDLLを作成できる)。

個人的には後者の方をよく使います。VB側にうっとうしい定義が必要なくなるからです。

長文を失礼。m(_ _)m

編集 削除
Drum  2002-08-23 17:04:59  No: 50334  IP: [192.*.*.*]

語学力がないので、間違っていたらご勘弁を。

まず、
DLL = Dynamic Link Library ですよね。
>dllを呼ぶ場合は、自分と同じプロセス内にdllが読み込まれる
プロセス内部のメモリ空間が一緒なら、DynamicではなくStaticのような気が・・・。
>大きな情報を渡したい時に、直にポインタを使えませんので、工夫が要ります。
ポインタってC言語の用語で、一般的な情報処理用語ではないような。
大きな情報って?C言語だとmain関数の引数ってポインタですけど。
>頻繁に交信を必要とする用途には良くはないと思います。
なんか、誤解を生みそうですね。

>・DLL内の関数の仕様は、基本的に作った人しかわからないので、他から流用される可能性が低くなる。
>・VC++などから利用したくなっても、比較的低コストで再利用できる。
この発言、矛盾してません?
DLLは他人に流用される(=再利用)から意味があるのです。
ですから、他人に仕様が分からないAPIをDLLとして提供しても全然意味がありません。
(ひょっとしたら、仕様=プログラムコードのことを言っているのかも知れませんが、仕様とプログラムコードはイコールではないです)

編集 削除
mel  2002-08-23 17:12:19  No: 50335  IP: [192.*.*.*]

Drumさん  ケンタロ〜Kさん

mel ですアドバイスありがとうございます。
お二人の話に十分ついてゆけない自分が情けないのですが・・・
呼び出すexeへはポインタを渡せないと言うのは目からウロコでした
Drumさんに紹介していただいた書籍を参考にさせていただきます。

ケンタロ〜Kさんの後半のまとめは参考になると言うか、理解できるよう
今後の課題にさせていただきたいと思います。

> >  また、VC++で開発したプログラム(関数)をVBにまったく取り込んでコンパイル
> > することは不可能なのでしょうか?

> VC++などで作成したDLLを、Vbで作ったEXEファイル内部に取り込み、運用するという話でしょうか?
> それは無理です。
> 通常、DLLファイルとEXEファイルは分かれた状態で使います。
> EXEのプログラムが必要とする時に、DLLがメモリ空間に取り込まれます。

これは、VC++で作った関数をライブラリにしてVB側のリンカーで取り込め
ないのかなぁと思いました。何か重大な勘違いをしているかもしれませんが
このようなアプローチ自体がないと言うことでしょうか?

編集 削除
Drum  2002-08-23 17:13:13  No: 50336  IP: [192.*.*.*]

×語学力
○読解力
でした。やっぱ日本語苦手だ〜。

編集 削除
YuO  2002-08-23 19:01:35  No: 50337  IP: [192.*.*.*]

> >dllを呼ぶ場合は、自分と同じプロセス内にdllが読み込まれる
> プロセス内部のメモリ空間が一緒なら、DynamicではなくStaticのような気が・・・。

ライブラリを実行時にリンクするのがDLL,
コンパイル時にリンクするのがStaticライブラリ(=ライブラリ)です。


> >大きな情報を渡したい時に、直にポインタを使えませんので、工夫が要ります。
> ポインタってC言語の用語で、一般的な情報処理用語ではないような。

モニカ,という表現を使うよりはわかりやすいのでは?


> >頻繁に交信を必要とする用途には良くはないと思います。
> なんか、誤解を生みそうですね。

そうですかねぇ……。
DLLで済むものであれば,DLLの方が圧倒的にコストが低いと思いますよ。
プロセス間通信は高くつきますから。


> >・DLL内の関数の仕様は、基本的に作った人しかわからないので、他から流用される可能性が低くなる。
> >・VC++などから利用したくなっても、比較的低コストで再利用できる。
> この発言、矛盾してません?

矛盾していますかねぇ……。
DLLの関数仕様は作った本人はわかっていますから,他人から流用はされませんが,
自分は仕様がわかっているので簡単に再利用できますよ。


> DLLは他人に流用される(=再利用)から意味があるのです。
> ですから、他人に仕様が分からないAPIをDLLとして提供しても全然意味がありません。

自分で使う複数のプログラムで同等のコードを書く場合にDLLにする事は意味があります。

例えば,Microsoft Visual Studio 97にDEVSHL.DLLというDLLがあります。
これは明らかにVisual Studio本体であるMSDEV.EXEから使われるためのDLLで,公開するためのものではありません。


> これは、VC++で作った関数をライブラリにしてVB側のリンカーで取り込め
> ないのかなぁと思いました。何か重大な勘違いをしているかもしれませんが
> このようなアプローチ自体がないと言うことでしょうか?

無いと考えるべきでしょう。
リンクすることは出来ますが,呼び出すためにプロシージャ・関数をコンパイラに認識させる方法がありません。

編集 削除
mel  2002-08-23 19:45:25  No: 50338  IP: [192.*.*.*]

melです

> > これは、VC++で作った関数をライブラリにしてVB側のリンカーで取り込め
> > ないのかなぁと思いました。何か重大な勘違いをしているかもしれませんが
> > このようなアプローチ自体がないと言うことでしょうか?

> 無いと考えるべきでしょう。
> リンクすることは出来ますが,呼び出すためにプロシージャ・関数をコンパイラに認識させる方法がありません。

YuOさん ありがとうございます。上記のことができれば手軽にVBからVC++の
資産を(まだ資産はありませんが・・・)利用できるのにと思っておりました。
やはり DLLにして利用するのが正道のようですね、でもいろいろ不明な点が
クリアになりました。結局課題は自分のスキルアップと言う結論のようです。
みなさん ありがとうございます。

編集 削除