複数のライブラリに同一の関数が含まれるときの処理について

[戻る]
えちぜん 2006/10/24(火) 11:03:59
えちぜんです

環境
 VisualStudio.Net 2005
  Visual C++ 2005
  コンソールアプリケーション

あるメーカの2つのデバイスを操作するライブラリA,Bがあります。
ひとつのプログラムにて両方のデバイスを操作するためにA,Bを使おうとしているのです
が、同一の名前を持つ関数が存在しました。

このような場合どういった開発を行うものなのでしょうか。
解決方法のひとつとして、
LoadLibraryを使用して関数ポインタを取得する

があると思いますが、他に方法があるのか知識として知っておきたいと思い質問しまし
た。

tetrapod 2006/10/24(火) 13:41:04
単純に「ライブラリ」と一言で片付けておられますが
DLL (Dynamic) と LIB (Static) では技術的にまったく異なる代物ですよ。

DLL なら提示のとおり LoadLibrary+GetProcAddress で解決するのがいい
それ以外の方法を選ぶべき理由が一切見つからない
LIB では原理的に解決不可能

だけど、同一メーカの作っているライブラリであるなら中身は同一かもしれない
その場合はなにもしなくてもいいかもしれない

PATIO 2006/10/24(火) 15:10:03
まずは、そのメーカーに確認するのが一番最初にする事だと思います。
少なくともデバイスを購入して使っているのであれば、購入先に質問しても
それなりの解答はされると思いますから。

あと、質問するときは出来る限り省略は止めましょう。
tetrapodさんも書かれているようにDLLとstatic Libでは扱いが全く異なりますから
レスポンスも変わってきます。LoadLibraryでと書いてあるからDLLだろうとは思いますけ
れど、
えちぜんさんの勘違いでLoadLibraryで大丈夫と思って書かれていてもこちら側では全く
わかりませんから。

PATIO 2006/10/24(火) 15:10:51
失礼、

購入先ではなくて購入元ですね。

えちぜん 2006/10/24(火) 17:34:27
[[解決]]
tetrapod様、PATIO様

返信遅くなりましてすみません。

Lib(static),DLL(dynamic)は共に提供されています。
省略してしまい申し訳ありません。

DLLから関数を直接呼び出せば出来るとは思っていたのですが、Libとヘッダーファイル
でも解決できるのかと思った次第です。

確かに、購入元に聞くことが必要ですね。
購入元にLoadLibraryで解決していいのか確認して決めたいと思います。

余談ですが
提供されたヘッダーファイルを編集し、namespaceをそれぞれつけてコンパイルしたとこ
ろ、コンパイルは通りますが、DebugとReleaseで動作が違うものが生成されました。


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

PATIO 2006/10/25(水) 16:40:27
> 提供されたヘッダーファイルを編集し、namespaceをそれぞれつけてコンパイルした
> ところ、コンパイルは通りますが、DebugとReleaseで動作が違うものが生成されました。

基本的に提供ファイルに手を入れた場合、動作保障はされないと思います。
提供元が手を入れて使ってくれと言う指示をしてきた時は話が別ですが。

確認だけしておきますが、
提供されているlibファイルってもしかしてDLLのイクスポートライブラリファイルだったり
しませんか?
明示的にstaticと書かれて提示されているなら多分間違いないと思うのですけれど。
ファイル名だけではstaticかDLLかの判断は出来ないのでちょっと老婆心が沸いた物です
から。

PATIO 2006/10/25(水) 16:41:42
もとい、
static LibかDLLのエクスポートライブラリかの判断は出来ないのでが正しいですね。

PATIO 2006/10/25(水) 16:42:43
あうあう。
エクスポートをイクスポートと書いている。
(T-T)すみません。

えちぜん 2006/10/28(土) 14:56:43
返答遅れまして、すみません。

私、LIBファイルのこと良くわかってなかったみたいです。
"*.lib"がインポートライブラリ、"*.dll"がエクスポートライブラリで決まっていると
思っていました。

VCのプロジェクトで追加のライブラリで*.libを追加しただけでは、実行時に必要なDLL
が足りませんとエラーになるということは、実体は*.dllの方に入っているということで
しょうか。

ちょっとこのあたり認識が不足しているようなので勉強します。
ライブラリのことよくわかってないのに質問をし、皆さんを混乱させてしまったようで
す。

PATIO 2006/10/30(月) 10:14:58
あいや、こちらこそ用語を間違って使っていたみたいですね。
確かにインポートライブラリが正しいです。
モジュールをインポートする為に使用するわけですしね。
ちゃんと確認して書き込むべきでした申し訳ない。

DLLと対で提供されているLibファイルは大抵の場合、インポート用のライブラリです。
これはDLLを実行環境に取り込むためのものでこれを使えば、LoadLibraryしなくても
DLLが使用できます。インポート用のライブラリはあくまでもDLL内の関数の位置を知る
為の物なので実体はDLLにあります。
従って動作時にそのDLLが実行環境に存在しないと動かないという事になります。
そのDLLがないとアプリケーションの動作が成立しないような場合は、大抵、インポート
ライブラリを使います。
逆にプラグイン等の付加的な機能を提供するDLLの場合は、なくてもアプリ自体は
動作する必要がありますから、インポートライブラリは使わず、LoadLibraryして
使います。この辺は適材適所で使い分けます。

古いスレッドには追加発言できません。