• ベストアンサー

VB6.0(SP6)からActiveXDLLをコールする方法

コマンドボタンを押すと DLL内のgReadItemがコールされる様に作成したのですが 実行すると 「実行時エラー453  エントリgReadItemがDLLファイルmenu.dll内に見つかりません。」 というエラーが発生します。 VB側の宣言は下記の方法で間違いないでしょうか? プロジェクトの参照設定でmenu.dllの設定も行っています。 回答宜しくお願いします。 <標準モジュールでの宣言> Public Declare Sub gReadItem Lib "menu.dll" () <フォームでのコマンド押下処理> Private Sub cmd1_Click() Call gReadItem End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.7

#1です。 #6補足に関してです。 クラスのメソッドの引数に コントロールを追加して渡したほうが早いんじゃないのかな? 制御が他のウィンドウに移った時点で、 ActiveFormは別なウィンドウになってしまいません?

takuyachiko
質問者

お礼

何度も回答ありがとうございます。 そうですね。 そのようにしてみます。 ありがとうございました!

その他の回答 (6)

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.6

#1です。 まず、#4の補足に関してです。 > <標準モジュールでの宣言> > Public Declare Sub gReadItem Lib "menu.dll" () > > 上記質問にも書いた宣言はVC++などVB以外で書いたDLLを読み込む時の宣言になるのですか? VB以外でっていうよりも、 ActiveXオブジェクト以外ではこの参照方式しか取れないということです。 > VBで作成したDLLでもAPIとして使う場合と使わない場合では > 記述の違いがあるのでしょうか? いまいち意味がよくわかりませんが、 Dll…ダイナミックリンクライブラリ→動的リンクライブラリ そもそもDllってのは動的に参照するためのリンクライブラリです。 動的ってなんぞやと思われるかもしれませんが、 簡単に言えば、 レジストリ登録されたリンクライブラリを使いますよってことです。 じゃあ動的じゃないのはどうなるのでしょうか? > Public Declare Sub gReadItem Lib "menu.dll" () のように固定のライブラリを参照するということです。 CやC++のActiveXオブジェクトでないDllをVBで参照する場合、 静的にしか参照できません。 その方式が、上記の宣言となります。 続いて、#5の指摘に関してです。 参照設定を使う場合、 「 <宣言部> [Public/Private/Dim] [オブジェクト名] As [クラス名] <コード記述部> Set [オブジェクト名] = CreateObject("[パッケージ名].[クラス名]") もしくは <宣言部> [Public/Private/Dim] [オブジェクト名] As New [クラス名] 」 の誤りでした。 少なくとも、[オブジェクト名].[クラス名]という書き方は、 VBについてのみ言えば、誤りです。

takuyachiko
質問者

お礼

了解です! ActiveXオブジェクト以外ではこの参照方式しか取れないということですね。 参照設定もうまくいきました。 ただ・・・・ クラスの関数内でエラーが起きてしまいました。 kakusukeさま、sam_inoueさま もしよければ ここでこの問題も教えていただけないでしょうか? コマンドボタンクリック時 オブジェクトのクラス内でフォームとボタンのオブジェクト名を取得したい時は どのようにしたらいいのでしょうか? クラス内の関数の処理は以下の通りです。 これではWithブロック変数が定義されていませんとエラーが起きてしまいます。 何かいい方法がありましたら宜しくお願いします。 With Screen.ActiveForm .ActiveControl.SetFocus ''INIファイルから読込み strRet = GetIniFile("c:\tmp\aa.ini","SEC_BUTTON", .Caption & "." & .ActiveControl.Caption)

  • sam_inoue
  • ベストアンサー率47% (27/57)
回答No.5

失礼します。 #4さんの説明では、参照設定とCreateObjectの内容が違いますが、 このようなことはないはずです。 どちらもオブジェクト変数に受け取るのは、 [オブジェクト名].[クラス名]のはずです。

takuyachiko
質問者

補足

No.3の補足に書いた分ですが Public ObjMenu As New menuitem.clsMenu にしたら宣言部の所はうまくいきました。 ありがとうございました。

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.4

#1です。 参照設定を使う場合、 <宣言部> [Public/Private/Dim] [オブジェクト名] As [インスタンス名] <コード記述部> Set [オブジェクト名] = CreateObject("[クラス名].[インスタンス名]") もしくは <宣言部> [Public/Private/Dim] [オブジェクト名] As New [インスタンス名] という記述を用いた上で、 Call [オブジェクト名].[メソッド名] で呼び出します。 環境変数の設定のやり方は ・マイコンピュータを右クリック →[プロパティ] →[詳細] →[環境変数] →[システム環境変数]の[Path]をダブルクリック で";フォルダのフルパス"を追記してあげればOKです。 質問、補足を読む限り、 多分APIとして使わないので、 読み飛ばしていただいても結構です。

takuyachiko
質問者

補足

<標準モジュールでの宣言> Public Declare Sub gReadItem Lib "menu.dll" () 上記質問にも書いた宣言はVC++などVB以外で書いたDLLを読み込む時の宣言になるのですか? VBで作成したDLLでもAPIとして使う場合と使わない場合では 記述の違いがあるのでしょうか? 今一分かってなくてすみません!

  • sam_inoue
  • ベストアンサー率47% (27/57)
回答No.3

>参照設定で設定していれば >CreateObject設定はしなくていいのでしょうか? そうです。 DLL側も同じ言語で作成しているなら、 実行時バインド(CreateObject)はあまり意味がないと思います。 参照設定の方が動作検証がはるかに楽です。 また、記述上でもクラスまで宣言すれば、 ピリオドを打つだけでプロシージャ名がリスト表示されます。

takuyachiko
質問者

お礼

補足のところに書いている menuItemではなくmenuの間違いです(^^ゞ

takuyachiko
質問者

補足

<宣言部> Public ObjMenu As menuItem と定義した所 「コンパイルエラー  プロジェクトではなくユーザー定義型を宣言してください」 とエラーがでました。 宣言部の書き方が間違っているのでしょうか? #参照設定で設定しています。 as スペースを入れるとちゃんとmenuItemがリスト表示の中に入っていました。

  • sam_inoue
  • ベストアンサー率47% (27/57)
回答No.2

DLL側の構造が分かりませんが、 ASPなどで用いるActiveX.DLLでは、参照設定で用いるか、 CreateObjectでDLLのクラスをつかんでから そのプロシージャを呼びだします。

takuyachiko
質問者

お礼

回答ありがとうございました。 参照設定で設定していれば CreateObject設定はしなくていいのでしょうか?

takuyachiko
質問者

補足

DLL側の構造は INIファイルへの読込み書き込みで クラスモジュール関数が2つです。 ・gReadItem(アイテム読込み) ・gSetItem(アイテム書込み)

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.1

APIコールするのに 参照設定は必要ないと思いますが…。 環境変数・PATHが通っていないと思われます。 Public Declare Sub gReadItem Lib "c:\hogehoge\menu.dll" () という風に絶対パスにするか、 環境変数・PATHに[c:\hogehoge]を追加してあげるか、 APIコールではなく、ActiveXオブジェクトの実装を追加する。 <標準モジュールでの宣言> Public ObjMenu As New Menu←これがどうなるかわかりませんが…。 <フォームでのコマンド押下処理> Private Sub cmd1_Click() Call ObjMenu.gReadItem End Sub といった具合にしなければいけないと思いますが。

takuyachiko
質問者

補足

回答ありがとうございます。 プロジェクトと同じフォルダにおいているので パスは通っていると思います。   >環境変数・PATHに[c:\hogehoge]を追加してあげるか どこで設定できますか? >Public ObjMenu As New Menu←これがどうなるかわかりませんが…。 ここのところが今一よく分かりません。 もう少し詳しく教えていただけないでしょうか?

関連するQ&A