プロが教えるわが家の防犯対策術!

コマンドボタンを押すと
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

A 回答 (7件)

#1です。



#6補足に関してです。

クラスのメソッドの引数に
コントロールを追加して渡したほうが早いんじゃないのかな?

制御が他のウィンドウに移った時点で、
ActiveFormは別なウィンドウになってしまいません?
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/09/25 23:54

#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についてのみ言えば、誤りです。
    • good
    • 0
この回答へのお礼

了解です!
ActiveXオブジェクト以外ではこの参照方式しか取れないということですね。

参照設定もうまくいきました。
ただ・・・・
クラスの関数内でエラーが起きてしまいました。
kakusukeさま、sam_inoueさま
もしよければ
ここでこの問題も教えていただけないでしょうか?

コマンドボタンクリック時
オブジェクトのクラス内でフォームとボタンのオブジェクト名を取得したい時は
どのようにしたらいいのでしょうか?

クラス内の関数の処理は以下の通りです。
これではWithブロック変数が定義されていませんとエラーが起きてしまいます。
何かいい方法がありましたら宜しくお願いします。

With Screen.ActiveForm
.ActiveControl.SetFocus
''INIファイルから読込み
strRet = GetIniFile("c:\tmp\aa.ini","SEC_BUTTON", .Caption & "." & .ActiveControl.Caption)

お礼日時:2005/09/25 21:50

失礼します。



#4さんの説明では、参照設定とCreateObjectの内容が違いますが、
このようなことはないはずです。

どちらもオブジェクト変数に受け取るのは、
[オブジェクト名].[クラス名]のはずです。

この回答への補足

No.3の補足に書いた分ですが

Public ObjMenu As New menuitem.clsMenu

にしたら宣言部の所はうまくいきました。

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

補足日時:2005/09/25 20:32
    • good
    • 0

#1です。



参照設定を使う場合、
<宣言部>
[Public/Private/Dim] [オブジェクト名] As [インスタンス名]
<コード記述部>
Set [オブジェクト名] = CreateObject("[クラス名].[インスタンス名]")

もしくは
<宣言部>
[Public/Private/Dim] [オブジェクト名] As New [インスタンス名]

という記述を用いた上で、

Call [オブジェクト名].[メソッド名]
で呼び出します。

環境変数の設定のやり方は
・マイコンピュータを右クリック
→[プロパティ]
→[詳細]
→[環境変数]
→[システム環境変数]の[Path]をダブルクリック
で";フォルダのフルパス"を追記してあげればOKです。

質問、補足を読む限り、
多分APIとして使わないので、
読み飛ばしていただいても結構です。

この回答への補足

<標準モジュールでの宣言>
Public Declare Sub gReadItem Lib "menu.dll" ()

上記質問にも書いた宣言はVC++などVB以外で書いたDLLを読み込む時の宣言になるのですか?

VBで作成したDLLでもAPIとして使う場合と使わない場合では
記述の違いがあるのでしょうか?

今一分かってなくてすみません!

補足日時:2005/09/25 19:58
    • good
    • 0

>参照設定で設定していれば


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

この回答への補足

<宣言部>
Public ObjMenu As menuItem

と定義した所
「コンパイルエラー
 プロジェクトではなくユーザー定義型を宣言してください」
とエラーがでました。
宣言部の書き方が間違っているのでしょうか?

#参照設定で設定しています。
as スペースを入れるとちゃんとmenuItemがリスト表示の中に入っていました。

補足日時:2005/09/25 19:39
    • good
    • 1
この回答へのお礼

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

お礼日時:2005/09/25 19:42

DLL側の構造が分かりませんが、


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

この回答への補足

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

補足日時:2005/09/25 18:24
    • good
    • 1
この回答へのお礼

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

お礼日時:2005/09/25 18:20

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
といった具合にしなければいけないと思いますが。

この回答への補足

回答ありがとうございます。
プロジェクトと同じフォルダにおいているので
パスは通っていると思います。
 
>環境変数・PATHに[c:\hogehoge]を追加してあげるか
どこで設定できますか?

>Public ObjMenu As New Menu←これがどうなるかわかりませんが…。

ここのところが今一よく分かりません。
もう少し詳しく教えていただけないでしょうか?

補足日時:2005/09/25 18:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!