• ベストアンサー

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です。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

>extern "C" __declspec(dllexport) long __stdcall put_sen(char *sen_area){ > >としてみて下さい。 bccはこれだけではだめです。 関数名の先頭にアンダースコアが修飾されてしまいます。 __declspec(dllexport)をつけるときは、コンパイル時に-u-オプションを指定する必要があります。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

型の話は、勘違いでした。 extern "C" __declspec(dllexport) long __stdcall put_sen(char *sen_area){ としてみて下さい。 sen_areaを確保しておかなければならないのは、#3の方と同じです。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.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で表示するだけなら問題ありませんが。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

型が違うからではないでしょうか? VBAでのStringとCでのchar*で型が異なるから。 Cの方でバリアントのストリングを使うとか

noname#22592
質問者

お礼

ご回答、ありがとうございます。 すいませんが、 >Cの方でバリアントのストリングを使う という意味がいまいちわかりません…。 ちなみに、このC++のソースをVC++でコンパイルするとうまくいきました。 以前はVC++を持っていたのですが、今は持っていないため、BCBを使っております。 BCBだとおっしゃる部分が問題になるのでしょうか??

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

> これで、EXCELファイルとDLLファイルを同じフォルダに入れて、マクロを実行すると、 同じように、ローカルで上手く探してくれなかった事がありました。 dllファイルを、 C:\WINNT C:\WINNT\system32 に置いた場合はどうでしょうか?

noname#22592
質問者

お礼

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

関連するQ&A