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」と怒られてしまいます。
説明が非常に悪いですが、もし経験者のかたがいらっしゃれば、解決策を教え
ていただければ幸いです。
>DLL2をDLL1にリンクした途端に、VBAから関数を呼び出そうと
これを、VCで作ったexeから呼び出すのは成功してるのでしょうか?
なんとなくだけど、
VBAの位置からDLL2がうまく見つかってないのだと思います
(これでもERRはDLL1が見つからないと出るはず)
> VBAの位置からDLL2がうまく見つかってないのだと思います
ものすごくこれっぽいです。
VB6で作ってみて、DLL2をexeと同じとこにおいて実行してみると成功したので、
VBAでも、Bookと同じとこにおいてできるかと思ったのですが、できませんでした。
ためしに、マイドキュメントにDLL2をおいてみたら上手く実行できました。
ExcelVBAではドコのパスが通っているのか微妙ですね。。。
確かに、私の環境でもマイドキュメントにDLL2をおくと実行できるようです。
もう少し調査してみますが、明示的に置く場所を指定できないものでしょうか・・。
確かに、私の環境でもマイドキュメントにDLL2をおくと実行できるようです。
もう少し調査してみますが、明示的に置く場所を指定できないものでしょうか・・。
報告いたします。
VBAにおいて、
chdir(thisworkbook.path)
chdrive(thisworkbook.path)
とすることにより、解決しました。
どうもありがとうございました。
> chdir(thisworkbook.path)
> chdrive(thisworkbook.path)
> とすることにより、解決しました。
確かにVBAでCurDir関数でカレントディレクトリを取得してみると、
Bookの位置ではなかったです。
>解決しました。
□←解決時は質問者本人がここをチェックしてください。
〜〜〜
マルチかよ。。。
http://www2.moug.net/bbs/exvba/20051031000023.htm
# カナーリ萎える罠。
両方解決しときましょうぜ。
解決いたしました。
ちなみに
> #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
ツイート | ![]() |