こんにちは。よろしくお願いします。
環境は、WindowsXP Access2000/VBA にてプログラミングをしています。
現在、表題の「DLLが正しく呼び出せません」エラーに泣かされています。。。。
どなたかもし心当たりなどありましたらぜひアドバイスを下さい。
VBAにてシステムを作成していますが、その中で、普通に自分で書いた関数を
普通に?呼び出しているだけなのですが、表題のエラーが頻発してしまい困っています。
別に、外部DLLをDeclareしてそれを呼び出した時に出ている、という事ではないです。
普通に自分で書いた関数を呼び出すだけなんですが、ある関数を呼び出すと、
返ってくる時にこのエラーが発生するものがあります。(SubでもFunctionでも)
引数の型や戻り値の型は、呼び出し側と整合が取れています。(確実に一致しています)
まったく原因がわからないので、例えばエラーの出た関数がSubの場合は
一応 Call をつけて呼び出してみたりするとその場はエラーがなくなったりして
でも、またその関数の中を編集したりすると、いつのまにかまた
その関数を呼び出した時に表題のエラーがでたりします。
もちろんコンパイルエラーはありませんし、SetしてNothingを忘れてメモリを壊している
という事などもないつもりです。
(エラーのでる関数ではそもそもSetなどを使っていませんし)
DLLの関数を呼び出すのではなく普通に標準モジュールなどに書いた自前の関数の呼び出しで
表題のエラーがでる原因として、なにか考えられる事はあるのでしょうか。
実際のソースを載せれないので申し訳ないですが、一般的な情報として
「DLLが正しく呼び出せません」エラーの原因となる事をどのような事でもけっこうですので
教えていただければ、と思います。
どうかよろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
VB/VBAから呼び出すDLLの関数は、Microsoft C/C++の用語で言うところのSTDCALL呼び出し規約でなければなりません。
呼び出し規約がSTDCALLでない関数(例えばcdecl呼び出し規約の関数)をVB/VBAから呼び出すと、関数の呼び出し自体は行われますが、関数の実行から戻ってきた時点で「DLLが正しく呼び出せません」エラーになります。
また、STDCALL呼び出し規約の関数であっても、呼び出し時に引数の数やサイズを間違えていると、やはり関数の実行から戻ってきた時点で「DLLが正しく呼び出せません」エラーになります。
このほか、呼び出された関数が何らかの理由(通常はプログラムミス=バグ)によりスタックポインタを通常あるべき値とは異なる値にして実行を終了すると、関数の実行から戻ってきた時点で「DLLが正しく呼び出せません」エラーになります。
ご回答ありがとうございます。
今回の場合、やはり一番可能性が高いのが私のプログラムミスに起因しているものかと実は思っています。。
アドバイスいただいたように、引数の数やサイズ等を間違えているのかと思い何度も見直しては見たんですが…うむむむ…やはりあっているようなんです。
「スタックポインタをあるべき値以外にして実行を終了する」というのは、メモリ管理等を誤って不正な書き込みをしてしまう事によるものですよね。
例えば、それ以外にスタックポインタを壊して(?)しまうような例というのは思い当たりますでしょうか?
いっその事そういう箇所があればいいんですが…どうにも見当たりません。。。
※すみません。。無学で、STDCALL呼び出し規約とそうでない呼び出し規約が分かりませんでした。ちょっと調べて見ます。。
いくつかの原因を明確に書いていただきありがとうございます。
さらに具体的な例など、また、もし実際に体験してこう解決したなどの情報がございましたら、皆さんもよろしくお願いいたしますっ。
No.2
- 回答日時:
WinXPではCALLBACK関数に操作させる関数は第一引数にHWND、第二引数にLPARAMをとるようなのですが・・。
引数が渡せないためエラーが起こっているのではと思います。その辺はどうでしょうか?
Public Functionの宣言で第一引数だけの場合、第二引数を追加してFunctionの宣言を記述してみてはどうでしょう。
ご回答ありがとうございます。
しばらく見ずにいてしまい返信が遅くなりまして申し訳ありません。
今回、DLLが正しく呼び出せませんエラーの起こる関数はいくつもあるのですが
共通点としては、Excel.Worksheet オブジェクトを引数とする関数であるという事みたいです。
Public のものも Private のものもエラーが出ていますが例えば
Public Function fncTest( ByRef shtSheet1 As Excel.Worksheet, ByRef shtSheet2 As Excel.Worksheet ) As Long
End Function
というような関数です。
関数内ではとりあえず終わりまで正常に実行され、この関数から戻るときに
DLL~エラーが発生します。なので、引数が渡せないためではないと思われるのです。
Excel のワークシートオブジェクトを引数に渡す事自体なにかまずいのでしょうか?
(現在参照渡しなので、値渡しにしたらどうかという話も聞いたのですが
処理上、どうしても参照渡しで行いたいのです。)
Excelのオブジェクトを引数にする場合の不具合情報などもしお持ちでしたらぜひよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
家の中でのこだわりスペースはどこですか?
自分の家で快適に過ごすために工夫しているスペースはありますか? 例)ベランダでお茶を飲むためのカフェテーブル ゲーミングに特化したこだわりのPCスペース
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
架空の映画のネタバレレビュー
映画のCMを見ていると、やたら感動している人が興奮で感想を話していますよね。 思わずストーリーが気になってしまう架空の感動レビューを教えて下さい!
-
Accessの画面更新を一時的に停止する方法。
その他(データベース)
-
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
-
4
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
-
5
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
6
【VBA】ファイルパスに半角スペースが入ると、VBAが動かない
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
AccessVBA 実行時エラー'2766'...
-
#1062 - '0' は索引 'PRIMARY' ...
-
『ORA-00936: 式がありません。...
-
SQL*Loaderで「オブジェクトが...
-
AccessからORACLEへのリンク設...
-
実行時エラー459 withステート...
-
重複チェックを行わず、INSERT...
-
オラクル(PL/SQL)のエラー
-
アクセスでエラー このフィー...
-
Access 実行時エラー'3075' 対...
-
MySQLで「ERROR 1064」が出てし...
-
(素人の質問) SQL Server エ...
-
空白はダメというエラーの表示...
-
SQLserver2005 nvarchar を flo...
-
SQLCODE=-420とはどういうエラ...
-
DB2のテーブルの修復方法
-
共有フォルダに誰が何にアクセ...
-
【Excel】[Expression.Error] ...
-
SQLPLUSで結果を画面に表示しない
-
Access2007のエキスポートについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#1062 - '0' は索引 'PRIMARY' ...
-
アクセスでエラー このフィー...
-
列名に変数を使うことはできな...
-
SQLserver2005 nvarchar を flo...
-
AccessVBA 実行時エラー'2766'...
-
(素人の質問) SQL Server エ...
-
オラクル(PL/SQL)のエラー
-
DocuWorksでの印刷
-
SQL*Loaderで「オブジェクトが...
-
Transact-SQLのBULK INSERTでエ...
-
UPDATEを使ったSQL文にて
-
空白はダメというエラーの表示...
-
Access2010実行時エラー-21473525
-
実行時エラー459 withステート...
-
SQLCODE=-420とはどういうエラ...
-
Access 実行時エラー'3075' 対...
-
エラーについて
-
『ORA-00936: 式がありません。...
-
BULK INSERTのエラー取得は可能...
-
オラクルでisnumeric?
おすすめ情報