コマンドボタンを押すと
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
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についてのみ言えば、誤りです。
了解です!
ActiveXオブジェクト以外ではこの参照方式しか取れないということですね。
参照設定もうまくいきました。
ただ・・・・
クラスの関数内でエラーが起きてしまいました。
kakusukeさま、sam_inoueさま
もしよければ
ここでこの問題も教えていただけないでしょうか?
コマンドボタンクリック時
オブジェクトのクラス内でフォームとボタンのオブジェクト名を取得したい時は
どのようにしたらいいのでしょうか?
クラス内の関数の処理は以下の通りです。
これではWithブロック変数が定義されていませんとエラーが起きてしまいます。
何かいい方法がありましたら宜しくお願いします。
With Screen.ActiveForm
.ActiveControl.SetFocus
''INIファイルから読込み
strRet = GetIniFile("c:\tmp\aa.ini","SEC_BUTTON", .Caption & "." & .ActiveControl.Caption)
No.4
- 回答日時:
#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として使う場合と使わない場合では
記述の違いがあるのでしょうか?
今一分かってなくてすみません!
No.3
- 回答日時:
>参照設定で設定していれば
>CreateObject設定はしなくていいのでしょうか?
そうです。
DLL側も同じ言語で作成しているなら、
実行時バインド(CreateObject)はあまり意味がないと思います。
参照設定の方が動作検証がはるかに楽です。
また、記述上でもクラスまで宣言すれば、
ピリオドを打つだけでプロシージャ名がリスト表示されます。
この回答への補足
<宣言部>
Public ObjMenu As menuItem
と定義した所
「コンパイルエラー
プロジェクトではなくユーザー定義型を宣言してください」
とエラーがでました。
宣言部の書き方が間違っているのでしょうか?
#参照設定で設定しています。
as スペースを入れるとちゃんとmenuItemがリスト表示の中に入っていました。
No.2
- 回答日時:
DLL側の構造が分かりませんが、
ASPなどで用いるActiveX.DLLでは、参照設定で用いるか、
CreateObjectでDLLのクラスをつかんでから
そのプロシージャを呼びだします。
この回答への補足
DLL側の構造は
INIファイルへの読込み書き込みで
クラスモジュール関数が2つです。
・gReadItem(アイテム読込み)
・gSetItem(アイテム書込み)
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
といった具合にしなければいけないと思いますが。
この回答への補足
回答ありがとうございます。
プロジェクトと同じフォルダにおいているので
パスは通っていると思います。
>環境変数・PATHに[c:\hogehoge]を追加してあげるか
どこで設定できますか?
>Public ObjMenu As New Menu←これがどうなるかわかりませんが…。
ここのところが今一よく分かりません。
もう少し詳しく教えていただけないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAVAからHTMLへ値を返す方法
-
パワーポイントのVBAでテキスト...
-
Object型からDouble型へのキャスト
-
EXCEL VBAにて動的にCheckBOXを...
-
Excelで =EMBED("Acrobat Docu...
-
CException についてVC6とVC200...
-
複数TBLのオブジェクトを1つの...
-
CoCreateInstanceでエラーになる。
-
VBA 同じ名前のオブジェクトを...
-
ワイルドカード<?>と型パラメー...
-
ビジュアルC++でボタンの有...
-
JqueryとPrototypeの比較
-
XAMLの動的生成について
-
C#でフォームのオブジェクト名...
-
bmp画像をjpegやpng画像に圧縮...
-
LISTBOXの内容が更新されま...
-
オブジェクト名をforループ内で...
-
ADO オブジェクトの渡し方
-
VB6-オブジェクトを配列にセット
-
C# Proxyを通してブラウザを開...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報