Regsvr32で登録したDllを、VBで宣言するには?
SORASA 2009/09/07(月) 14:59:02
基本的な質問です。
開発環境:
OS:Windows XP Pro SP2
IDE:VB6.0
Regsvr32で登録したDllを、VB内でDeclare宣言してから、使いたいと思うのですが、どう記載してよいのか分りません。(場所とか)
下の"********"部分をどう書いてよいのか分りません。
Declare Function Lib "********" (ByVal ‾‾‾‾) As Integer
基本的なことで申し訳ございませんが、教えて下さい。
魔界の仮面弁士 2009/09/07(月) 15:23:33
何故、そのような事をしたいのでしょうか?
ActiveX DLL のメソッドは、外部関数として公開された物では無いため、
Declare で宣言して使う事は出来ません。
素直に、参照設定(またはレイトバインド)で呼び出しましょう。
世の中には、参照設定からでも Declare からでも使えるよう、
両対応に設計されたライブラリ(例: basp21.dll)もありますが、
そもそも VB6 製の ActiveX DLL の場合、Declare 用に公開される関数は、
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
のみであり、それぞれのメソッドを Declare で呼べるような構造にはなっていません。
EBOOT.PBPを実行する方法
# undocumented な方法として、リンカオプションを指定して無理やり外部公開するとか、
# oleaut32.dll の低レベルAPIで IUnknown ポインタを直接操作するといった
# ひどく遠回りな方法もありますが、そうまでして Declare に拘っても、あまり意味は無いでしょう。
SORASA 2009/09/07(月) 15:41:55
魔界の仮面弁士 様
ご回答有難うございます。
しかし、参照設定にそれらしきものが無いので、困っています。
RegEditで登録されているか確認すると、
HKEY_CLASSES_ROOT¥CLSIDの下、
[InProcServer32]にDllのフルパスが格納されており、
[ProgID]のデータ領域にタイプIDが格納されています。
故にこれをDeclareすればよいのかなと思っていたのですが、違いますか?
魔界の仮面弁士 2009/09/07(月) 16:35:56
> しかし、参照設定にそれらしきものが無いので、困っています。
[プロジェクト(P)]-[参照設定(N)...]メニューのダイアログを開き、
[参照(B)...]ボタンを押して、対象を選んでください。
> 違いますか?
違います。
SORASA 2009/09/07(月) 17:02:05
魔界の仮面弁士 様
ご回答有難うございます。
>[プロジェクト(P)]-[参照設定(N)...]メニューのダイアログを開き、
>[参照(B)...]ボタンを押して、対象を選んでください。
既にしましたが、参照で追加できません。
→ファイルにアクセスできて、有効なアセンブリであること、またはCOMコンポーネントであることを確認して下さい・・・と出ます。
お使いのコンピュータ上でPowerPointを置く方法
対象のDLLファイルを、右クリック-プロパティでみると、「OLESelfRegister」という項目があります。
ひょっとして、Regsvr32で既にレジストリ[HKEY_CLASSES_ROOT]以下に登録されてあるので、「参照設定」とかしなくとも本来実行できるはずなのですか?
参照設定できないことが問題なのか、レジストリの[HKEY_CLASSES_ROOT]以下に登録されてあるにも関わらず、CreateObjectを実行しても、「ファイルリソースが見つかりません」とリソース先を見つけられないことが問題なのか、この切り分けで困っています。
魔界の仮面弁士 2009/09/07(月) 18:39:46
…… VB6 の IDE で、そんなメッセージ出ましたっけ?
参照設定できないファイルを設定した場合のメッセージは、
VB6『指定されたファイルへの参照は登録できません。』
だったかと思います。
これが Visual Basic .NET 系の IDE であれば、
VB8『ファイルにアクセスできて、有効なアセンブリであること、または COM コンポーネントであることを確認してください。』
VB9『ファイルがアクセス可能で、有効なアセンブリまたは COM コンポーネントであることを確認してください。』
というメッセージになりますが―――それにしても、SORASAさんが遭遇したという
VB?『ファイルにアクセスできて、有効なアセンブリであること、またはCOMコンポーネントであることを確認して下さい』
のメッ セージとは微妙に異なっていますね(少なくとも私は、そのエラーを見たことがありません)。
dllファイルを再インストールする方法
> 対象の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 するための権限が不足していた場合のものでした。
追加発言(4ヶ月以上古い記事に書き込めません。)
0 コメント:
コメントを投稿