こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

DLLが正しく呼び出せません (ToT)

こんにちは。よろしくお願いします。

環境は、WindowsXP Access2000/VBA にてプログラミングをしています。
現在、表題の「DLLが正しく呼び出せません」エラーに泣かされています。。。。
どなたかもし心当たりなどありましたらぜひアドバイスを下さい。

VBAにてシステムを作成していますが、その中で、普通に自分で書いた関数を
普通に?呼び出しているだけなのですが、表題のエラーが頻発してしまい困っています。

別に、外部DLLをDeclareしてそれを呼び出した時に出ている、という事ではないです。
普通に自分で書いた関数を呼び出すだけなんですが、ある関数を呼び出すと、
返ってくる時にこのエラーが発生するものがあります。(SubでもFunctionでも)

引数の型や戻り値の型は、呼び出し側と整合が取れています。(確実に一致しています)

まったく原因がわからないので、例えばエラーの出た関数がSubの場合は
一応 Call をつけて呼び出してみたりするとその場はエラーがなくなったりして
でも、またその関数の中を編集したりすると、いつのまにかまた
その関数を呼び出した時に表題のエラーがでたりします。

もちろんコンパイルエラーはありませんし、SetしてNothingを忘れてメモリを壊している
という事などもないつもりです。
(エラーのでる関数ではそもそもSetなどを使っていませんし)

DLLの関数を呼び出すのではなく普通に標準モジュールなどに書いた自前の関数の呼び出しで
表題のエラーがでる原因として、なにか考えられる事はあるのでしょうか。

実際のソースを載せれないので申し訳ないですが、一般的な情報として
「DLLが正しく呼び出せません」エラーの原因となる事をどのような事でもけっこうですので
教えていただければ、と思います。

どうかよろしくお願いいたします。

投稿日時 - 2005-09-17 18:46:43

QNo.1655455

すぐに回答ほしいです

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

VB/VBAから呼び出すDLLの関数は、Microsoft C/C++の用語で言うところのSTDCALL呼び出し規約でなければなりません。

呼び出し規約がSTDCALLでない関数(例えばcdecl呼び出し規約の関数)をVB/VBAから呼び出すと、関数の呼び出し自体は行われますが、関数の実行から戻ってきた時点で「DLLが正しく呼び出せません」エラーになります。

また、STDCALL呼び出し規約の関数であっても、呼び出し時に引数の数やサイズを間違えていると、やはり関数の実行から戻ってきた時点で「DLLが正しく呼び出せません」エラーになります。

このほか、呼び出された関数が何らかの理由(通常はプログラムミス=バグ)によりスタックポインタを通常あるべき値とは異なる値にして実行を終了すると、関数の実行から戻ってきた時点で「DLLが正しく呼び出せません」エラーになります。

投稿日時 - 2005-09-17 20:52:29

お礼

ご回答ありがとうございます。

今回の場合、やはり一番可能性が高いのが私のプログラムミスに起因しているものかと実は思っています。。
アドバイスいただいたように、引数の数やサイズ等を間違えているのかと思い何度も見直しては見たんですが…うむむむ…やはりあっているようなんです。

「スタックポインタをあるべき値以外にして実行を終了する」というのは、メモリ管理等を誤って不正な書き込みをしてしまう事によるものですよね。
例えば、それ以外にスタックポインタを壊して(?)しまうような例というのは思い当たりますでしょうか?

いっその事そういう箇所があればいいんですが…どうにも見当たりません。。。

※すみません。。無学で、STDCALL呼び出し規約とそうでない呼び出し規約が分かりませんでした。ちょっと調べて見ます。。

いくつかの原因を明確に書いていただきありがとうございます。
さらに具体的な例など、また、もし実際に体験してこう解決したなどの情報がございましたら、皆さんもよろしくお願いいたしますっ。

投稿日時 - 2005-09-18 00:56:51

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

WinXPではCALLBACK関数に操作させる関数は第一引数にHWND、第二引数にLPARAMをとるようなのですが・・。
引数が渡せないためエラーが起こっているのではと思います。その辺はどうでしょうか?
Public Functionの宣言で第一引数だけの場合、第二引数を追加してFunctionの宣言を記述してみてはどうでしょう。

投稿日時 - 2005-09-22 11:03:20

お礼

ご回答ありがとうございます。
しばらく見ずにいてしまい返信が遅くなりまして申し訳ありません。

今回、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のオブジェクトを引数にする場合の不具合情報などもしお持ちでしたらぜひよろしくお願いいたします。

投稿日時 - 2005-09-24 15:14:31

あなたにオススメの質問