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

解決済みの質問

EXCELのマクロからDLLをコール

EXCELのマクロからDLL内部の関数をコールしたいのですが、うまくいきません。
DLLは、BCC DeveloperとBorland C++ Builer 5を使って作りました。DLLのソースは以下の通りです。

dlltest.cpp
=====================================
#include <stdio.h>

extern "C" long __stdcall put_sen(char *sen_area)
{
strcpy(sen_area, "Hello world!");

return 0;
}
=====================================

EXCELのマクロは以下の通りです。
=====================================
Declare Function put_sen Lib "dlltest.dll" (ByVal sen_area As String) As Long

Sub test()

Dim sen_area As String
Dim rtn As Long


t_st = ActiveWorkbook.Path
ChDrive Left(t_st, 1)
ChDir t_st

rtn = put_sen(sen_area)

MsgBox sen_area

End Sub
=====================================

これで、EXCELファイルとDLLファイルを同じフォルダに入れて、マクロを実行すると、

実行時エラー'453'
エントリ put_sen が DLLファイル dlltest.dll 内に見つかりません。

とエラーが表示されます。
以前、VC++でDLLを作った際には、これでうまくいったと思うのですが…。
どこがいけないのか、どなたかご教授よろしくお願いします。

ちなみにOSはWindows2000です。

投稿日時 - 2004-12-16 15:22:36

QNo.1129556

暇なときに回答ください

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

>extern "C" __declspec(dllexport) long __stdcall put_sen(char *sen_area){
>
>としてみて下さい。

bccはこれだけではだめです。
関数名の先頭にアンダースコアが修飾されてしまいます。

__declspec(dllexport)をつけるときは、コンパイル時に-u-オプションを指定する必要があります。

投稿日時 - 2004-12-16 21:55:18

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

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

回答(5)

ANo.4

型の話は、勘違いでした。

extern "C" __declspec(dllexport) long __stdcall put_sen(char *sen_area){

としてみて下さい。
sen_areaを確保しておかなければならないのは、#3の方と同じです。

投稿日時 - 2004-12-16 20:31:49

ANo.3

>エントリ put_sen が DLLファイル dlltest.dll 内に見つかりません。

DLL内にput_senが見つからないというエラーですよね。
DLLそのものは検索されています。


>dlltest.cpp

C++ですよね。
defファイル作らないと関数名がbccによって変えられてしまいます。

Rubyから呼ぶときですが、defの作り方は一緒です。
http://gimite.ddo.jp/behind/bcbrubyext.htm

>型が違うからではないでしょうか?
型は問題ないです。

ですが、DLL作り直しても使い方が
>rtn = put_sen(sen_area)
ではまずいです。

あらかじめ、VBA側で領域を確保する必要があります。

sen_area = Space(256)
rtn = put_sen(sen_area)

また、DLLより取得された文字列はNULL終端の文字列なので、VBA側でNULL文字を削除する必要があります。
#まぁ、MsgBoxで表示するだけなら問題ありませんが。

投稿日時 - 2004-12-16 20:15:08

ANo.2

型が違うからではないでしょうか?

VBAでのStringとCでのchar*で型が異なるから。

Cの方でバリアントのストリングを使うとか

投稿日時 - 2004-12-16 16:12:49

お礼

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

すいませんが、
>Cの方でバリアントのストリングを使う
という意味がいまいちわかりません…。

ちなみに、このC++のソースをVC++でコンパイルするとうまくいきました。
以前はVC++を持っていたのですが、今は持っていないため、BCBを使っております。

BCBだとおっしゃる部分が問題になるのでしょうか??

投稿日時 - 2004-12-16 16:24:13

ANo.1

> これで、EXCELファイルとDLLファイルを同じフォルダに入れて、マクロを実行すると、

同じように、ローカルで上手く探してくれなかった事がありました。
dllファイルを、

C:\WINNT
C:\WINNT\system32

に置いた場合はどうでしょうか?

投稿日時 - 2004-12-16 15:27:08

お礼

状況は変わりませんでした。
ご検討、ありがとうございました。

投稿日時 - 2004-12-16 15:55:09

あなたにオススメの質問