VC++5.0を使ってプログラムを作っているのですが、
お客さんのところにインストールできなくて困っています。
Developer StudioのMFC AppWizard(.exe)を使ってプログラムを
作成しているのですが、
Visual Cをインストールしていないお客さんのマシンにそのプログラム
をインストールすると、DLLがないといって動きません。
AppWizard では、スタティックなライブラリ使用にしています。
また、InstallShield Express VCを使ってインストーラを作成してみた
のですが、¥Windows¥systemのしたのいくつかのDLLはついていく
ようなのですが、それでもまだ足りないとおこられます。
足りないDLLは、たとえば、「oleaut32.dll」です。
(oleとか使っていないつもりなのですが)
Visual Cがインストールされていないマシンでは、基本的にはMFCの
プログラムは動かないのでしょうか?
動かそうと思った場合、どのDLLを必要としているか、どうやって調べれば
よいのでしょうか?
¥Windows¥systemのしたのDLLを全部もっていくなどしたくありません。
しかし、足りないDLLをもっていくと、また次のDLLが足りないと
それの繰り返しになっています。
なんとか必要なDLLがわかる方法を教えてください。
よろしくお願いします。
MFCのライブラリの中で CreateFontIndirectという関数が参照されているので、
OLEを使っていなくても勝手に oleaut32.dllが必要になってしまいます。
この oleaut32.dllが必要とする DLLは
OLE32.DLL, USER32.DLL, GDI32.DLL, KERNEL32.DLL, ADVAPI32.DLL
の 5つですが、これらの DLLはすべての Windows95/NTに標準で入っているので
oleaut32.dllを持っていくだけでたぶん大丈夫です。
#高橋さんが他に特別な DLLを使っていれば別ですが。
ところで、この CreateFontIndirect関数はもともと olepro32.dllのものだった
のですが、oleaut32.dll Version 2.20以降ではなぜか oleaut32.dllにも
同じ名前の CreateFontIndirect関数が入っています。
MFCの標準的なスタティックリンク設定でビルドすると olepro32.libよりも先に
oleaut32.libを使って参照が解決されてしまうので、スタティックリンクした
アプリでは oleaut32.dllの中の CreateFontIndirectが使われることになるので
すが、困ったことに昔の Windows 95に使われていた oleaut32.dll Version 2.1
には CreateFontIndirect関数がありません。
そのため、実行時に「OLEAUT32.DLLの欠落エクスポートが見つかりません」
(= oleaut32.dllにあるはずの CreateFontIndirectがエクスポートされてない)
というエラーが出てアプリが起動しなくなってしまうわけです。
以上のような原因であることを考慮し、次のようなトリックを使って
リンク時に先に olepro32.libで参照を解決すれば oleaut32.dllがなくても
動作するバイナリが作成できます。
-----------------
1. VC++5.0の「プロジェクト(P)」メニューの「設定(S)... ALT+F7」で
プロジェクト設定ダイアログを表示させる。
2.「リンク」タブを選び、カテゴリリストから「インプット」を選択。
3.「オブジェクト/ライブラリ モジュール(M):」欄に
「olepro32.lib oleaut32.lib」と書く。
「olepro32.lib」と「oleaut32.lib」の間は半角スペースである。
(ヘルプにはカンマで区切るように書かれているが、ウソ。)
4. 「無視するライブラリ(I):」欄に「olepro32.lib,oleaut32.lib」と書く。
「olepro32.lib」と「oleaut32.lib」の間はカンマである。
5. ビルドしなおす。
-----------------
新しいバージョンの oleaut32.dllを持っていくようにするべきか、
上記のトリックを使って新しい oleaut32.dllがなくても動くようにするべきか、
どちらがいいのかは何とも言えません。
トラブルがあっても私は責任を負えないので、よく調査した上で
いずれかの方法を選んでください。
> なんとか必要なDLLがわかる方法を教えてください。
昔は depends.exeというものがあったそうです。
Microsoftが作ったもので、
ツリー形式で必要な DLLが表示できる便利なツールなのですが、
うわさでは最近になってこの世から抹殺されてしまったらしいです。
古い SDK(97/1ごろ?)を探すと入っているかもしれません。
depends.exe以外では、dumpbin /importsを使って順番に追っていっても
一応わかりますが・・・、ちょっと面倒くさいですね。
--
ねこぞう
OKUDA Tetsuya wrote:
> MFCのライブラリの中で CreateFontIndirectという関数が参照されているので、
> OLEを使っていなくても勝手に oleaut32.dllが必要ノなってしまいます。
CreateFontIndirectじゃなくて OleCreateFontIndirectでした。
CreateFontIndirectは GDI32.DLLですね。
--
ねこぞう
エクスプローラで、作成したプログラムを右クリックして
「クイックビューア」で見てください。Import Tableに
実行に必要なDLLが出てきます。
たいていはこれで大丈夫だと思います。
--
渡部一英 // Packet Radio User's Group // JE7LQS/1(再開局準備中)
VC++のCD-ROMを持っていると思いますので、その中の以下のファイルをご一読すると
良いと思います。
<DriveName>:\Msdev\Redist\Redistrb.wri
確認は、VC++ Ver4.2で行いましたが、総てのVC(初代から)に付いていると思いま
す。
尚、もしこの情報を高橋さんがご存じでしたら、大きなお世話だったと思います。
役に立たない情報で大変申し訳ないです。
でも、もしお役に立ちましたら幸いです。
酒井和彦@㈱コンダクト 電子機器部
Kazuhide Watanabe wrote in message ...
酒井和彦@㈱コンダクト 電子機器部
sa...@conduct.co.jp [会社]
k-t...@po3.nsknet.or.jp [自宅]
Katsumi Nakamura wrote in message <65tjhb$jpl$1...@jack.vit.or.jp>...
>In article <KWAT.97No...@nadia95.nadia.prug.or.jp>,
kw...@nadia.prug.or.jp says...
>すみません。
>「クイックビューア」ってどこにあるのでしょうか?
>
Katsumi Nakamura wrote in message <65tjhb$jpl$1...@jack.vit.or.jp>...
>In article <KWAT.97No...@nadia95.nadia.prug.or.jp>,
kw...@nadia.prug.or.jp says...
>すみません。
>「クイックビューア」ってどこにあるのでしょうか?
>
ビューしたいファイルのアイコンを右クリックして、そのメニューの中に"クイックヒ
ビューワ"があります。
このプログラムはWindows95のユーザとしては非常に便利なものですので基本知識と
して覚えておくとよいでしょう。プログラマであれば頻繁に使用します。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
大日向大地<D.Obinata.>
e-mail Home fwic...@mb.infoweb.or.jp
http://village.infoweb.or.jp/~fwic0625/index.htm
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/