Excell VBA からDLLとリンクしたDLLを呼び出す

解決


kazy  2005-11-01 02:12:36  No: 59401

VC++で作成したDLLが二つあります。DLL1では内部でDLL2の関数を使用してい
ます。このDLL2の関数を使用しているDLL1の関数をエクセルVBAから呼び出し
たいと思っています。

DLL1からは
#pragma comment(lib,"DLL2.dll")としてリンクし、
DLLからのエクスポートは、__declspec(dllexport)を使用しています。ただし
、(なぜかVBAからの呼び出しがうまくいかなかった<*>ので)defファイル
も用意し、設定しています。

//****************
<*>ここで言うVBAからの呼び出しというのは、VBAからDLL1のみ(DLL2の関
数を使用しないようにコーディングし、DLL2とリンクしないもの)やDLL2のみ
を呼び出す、ということです。
//******************

DLL1をexeとして作成した場合には問題なくDLL2の関数を呼び出せています。
また、(上述のように)DLL2にリンクしないならばDLL1をVBAから呼び出すこ
とは成功しています。
しかしながら、DLL2をDLL1にリンクした途端に、VBAから関数を呼び出そうと
すると、
「ファイルが見つかりません; c:\****\DLL1.dll」と怒られてしまいます。

説明が非常に悪いですが、もし経験者のかたがいらっしゃれば、解決策を教え
ていただければ幸いです。


ryo  2005-11-01 06:41:53  No: 59402

>DLL2をDLL1にリンクした途端に、VBAから関数を呼び出そうと
  これを、VCで作ったexeから呼び出すのは成功してるのでしょうか?

  なんとなくだけど、
  VBAの位置からDLL2がうまく見つかってないのだと思います
(これでもERRはDLL1が見つからないと出るはず)


Blue  2005-11-01 07:38:34  No: 59403

> VBAの位置からDLL2がうまく見つかってないのだと思います
ものすごくこれっぽいです。

VB6で作ってみて、DLL2をexeと同じとこにおいて実行してみると成功したので、
VBAでも、Bookと同じとこにおいてできるかと思ったのですが、できませんでした。
ためしに、マイドキュメントにDLL2をおいてみたら上手く実行できました。
ExcelVBAではドコのパスが通っているのか微妙ですね。。。


kazy  2005-11-01 10:52:06  No: 59404

確かに、私の環境でもマイドキュメントにDLL2をおくと実行できるようです。
もう少し調査してみますが、明示的に置く場所を指定できないものでしょうか・・。


kazy  2005-11-01 10:52:07  No: 59405

確かに、私の環境でもマイドキュメントにDLL2をおくと実行できるようです。
もう少し調査してみますが、明示的に置く場所を指定できないものでしょうか・・。


kazy  2005-11-01 14:07:54  No: 59406

報告いたします。
VBAにおいて、
chdir(thisworkbook.path)
chdrive(thisworkbook.path)
とすることにより、解決しました。

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


Blue  2005-11-01 17:41:15  No: 59407

> chdir(thisworkbook.path)
> chdrive(thisworkbook.path)
> とすることにより、解決しました。
確かにVBAでCurDir関数でカレントディレクトリを取得してみると、
Bookの位置ではなかったです。


忘れ物  2005-11-01 23:57:50  No: 59408

>解決しました。
□←解決時は質問者本人がここをチェックしてください。
                  〜〜〜


Blue  2005-11-02 09:49:55  No: 59409

マルチかよ。。。
http://www2.moug.net/bbs/exvba/20051031000023.htm
# カナーリ萎える罠。

両方解決しときましょうぜ。


kazy  2005-11-02 10:09:34  No: 59410

解決いたしました。


Blue  2005-11-02 10:17:15  No: 59411

ちなみに
> #pragma comment(lib,"DLL2.dll")としてリンクし、
は構文エラーなのでは?リンカとおりましたか?

MSDN
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_PREDIR_comment.asp

ちなみに向こうで話題に出ていたLoadLibrary関数でDLLをリンクする
方法と、libを使ってリンクする方法はちがいますので気をつけてください。

関連スレ-DLL 暗黙的リンク 明示的リンク の差異
http://www.vcppclub.com/bbs1/wforum.cgi?mode=allread&no=2522&page=30


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加