Regsvr32で登録したDllを、VBで宣言するには?


SORASA  2009-09-07 23:59:02  No: 142495

基本的な質問です。
開発環境:
OS:Windows XP Pro SP2
IDE:VB6.0

Regsvr32で登録したDllを、VB内でDeclare宣言してから、使いたいと思うのですが、どう記載してよいのか分りません。(場所とか)
下の"********"部分をどう書いてよいのか分りません。

Declare Function Lib "********" (ByVal ~~~~) As Integer

基本的なことで申し訳ございませんが、教えて下さい。


魔界の仮面弁士  2009-09-08 00:23:33  No: 142496

何故、そのような事をしたいのでしょうか?

ActiveX DLL のメソッドは、外部関数として公開された物では無いため、
Declare で宣言して使う事は出来ません。
素直に、参照設定(またはレイトバインド)で呼び出しましょう。

世の中には、参照設定からでも Declare からでも使えるよう、
両対応に設計されたライブラリ(例: basp21.dll)もありますが、
そもそも VB6 製の ActiveX DLL の場合、Declare 用に公開される関数は、
  DllCanUnloadNow
  DllGetClassObject
  DllRegisterServer
  DllUnregisterServer
のみであり、それぞれのメソッドを Declare で呼べるような構造にはなっていません。

# undocumented な方法として、リンカオプションを指定して無理やり外部公開するとか、
# oleaut32.dll の低レベルAPIで IUnknown ポインタを直接操作するといった
# ひどく遠回りな方法もありますが、そうまでして Declare に拘っても、あまり意味は無いでしょう。


SORASA  2009-09-08 00:41:55  No: 142497

魔界の仮面弁士 様

ご回答有難うございます。
しかし、参照設定にそれらしきものが無いので、困っています。

RegEditで登録されているか確認すると、

HKEY_CLASSES_ROOT\CLSIDの下、
[InProcServer32]にDllのフルパスが格納されており、
[ProgID]のデータ領域にタイプIDが格納されています。

故にこれをDeclareすればよいのかなと思っていたのですが、違いますか?


魔界の仮面弁士  2009-09-08 01:35:56  No: 142498

> しかし、参照設定にそれらしきものが無いので、困っています。
[プロジェクト(P)]-[参照設定(N)...]メニューのダイアログを開き、
[参照(B)...]ボタンを押して、対象を選んでください。

> 違いますか?
違います。


SORASA  2009-09-08 02:02:05  No: 142499

魔界の仮面弁士 様

ご回答有難うございます。

>[プロジェクト(P)]-[参照設定(N)...]メニューのダイアログを開き、
>[参照(B)...]ボタンを押して、対象を選んでください。

既にしましたが、参照で追加できません。
→ファイルにアクセスできて、有効なアセンブリであること、またはCOMコンポーネントであることを確認して下さい・・・と出ます。

対象のDLLファイルを、右クリック-プロパティでみると、「OLESelfRegister」という項目があります。
ひょっとして、Regsvr32で既にレジストリ[HKEY_CLASSES_ROOT]以下に登録されてあるので、「参照設定」とかしなくとも本来実行できるはずなのですか?

参照設定できないことが問題なのか、レジストリの[HKEY_CLASSES_ROOT]以下に登録されてあるにも関わらず、CreateObjectを実行しても、「ファイルリソースが見つかりません」とリソース先を見つけられないことが問題なのか、この切り分けで困っています。


魔界の仮面弁士  2009-09-08 03:39:46  No: 142500

…… VB6 の IDE で、そんなメッセージ出ましたっけ?

参照設定できないファイルを設定した場合のメッセージは、
  VB6『指定されたファイルへの参照は登録できません。』
だったかと思います。

これが Visual Basic .NET 系の IDE であれば、
  VB8『ファイルにアクセスできて、有効なアセンブリであること、または COM コンポーネントであることを確認してください。』
  VB9『ファイルがアクセス可能で、有効なアセンブリまたは COM コンポーネントであることを確認してください。』
というメッセージになりますが———それにしても、SORASAさんが遭遇したという
  VB?『ファイルにアクセスできて、有効なアセンブリであること、またはCOMコンポーネントであることを確認して下さい』
のメッセージとは微妙に異なっていますね(少なくとも私は、そのエラーを見たことがありません)。

> 対象のDLLファイルを、右クリック-プロパティでみると、「OLESelfRegister」という項目があります。
"OLESelfRegister" が無くても 参照設定できる DLL は多いので、それだけでは
ActiveX DLL であると決め付けるわけには行きませんが、VB6 製の DLL であれば、
その項目名が入りますから、それが ActiveX DLL である可能性は高そうですね。
(最初の質問からして、Regsvr32 自体は正常に登録されているのでしょうし)

その DLL は、どのようにして作成したもの(もしくは入手したもの)なのでしょうか?

> 参照設定できないことが問題なのか、
DLL だけではなく、その DLL の依存コンポーネントが揃っているかどうか、
DLL の提供元に問い合わせてみてください。依存ランタイムやライセンスファイル等が
不足しているのかも知れませんし。

また、それらの DLL の素性を明らかにするために、
OLE/COM オブジェクトビューワ(OLEVIEW.EXE)で タイプライブラリ情報を参照したり、
Dependency Walker (DEPENDS.EXE) で、外部公開関数の一覧などを調べてみるのも良いかも。

> レジストリの[HKEY_CLASSES_ROOT]以下に登録されてあるにも関わらず、CreateObjectを実行しても、
レジストリには、他にどのように登録されていますか? 少なくとも、
>>> HKEY_CLASSES_ROOT\CLSIDの下、
>>> [InProcServer32]にDllのフルパスが格納されており、
>>> [ProgID]のデータ領域にタイプIDが格納されています。
だけでは、登録情報が足らないように思えます。

> CreateObjectを実行しても、「ファイルリソースが見つかりません」と
> リソース先を見つけられないことが問題なのか、この切り分けで困っています。
このメッセージも、私は見たことがありません…。
  『ファイルリソースが見つかりません』
ではなく、
  『必要なリソースが見つかりません。』
  『リソースが見つかりませんでした。』
などであれば、幾度か目にしているのですが、これらは CreateObject のタイミングで
発生するものではありませんでした。

CreateObject を失敗した時に出るメッセージとして、私が見た事があるのは、
  『ActiveX コンポーネントはオブジェクトを作成できません。』

  『オートメーション エラーです。
    指定されたモジュールが見つかりません。』
などですね。いずれも、コンポーネントのセットアップに失敗しているか、または
CreateObject するための権限が不足していた場合のものでした。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加