• 締切済み

VBA,ASPなどから呼び出せるDLLの作成

DLLを作成したいです。 開発環境 OS:WindowsXP HOME SP2 IDE:Visual C++ 2005 作成したいのはBASP21 DLL(http://www.hi-ho.ne.jp/babaq/basp21.html)のようなVBA、VBScriptから呼び出せるDLLです。 以下のように作成しました。 1 新規プロジェクト>ATLプロジェクト(プロジェクト名:dlltest)   (ダイナミックリンクライブラリ・非属性、デフォルト) 2 プロジェクト>クラスの追加>ATLシンプルオブジェクト(クラス名:cl1、オプションはデフォルト) 3 作成されたインターフェースIcl1を右クリックしてメソッドを追加   メソッド名:mtest1 質問したいのはこのメソッドで値を呼び出し側に返す方法です。 COMの仕様で返り値はHRESULTと聞きました。 LONG型の引数を受け取って2倍した値を返すメソッドみたいな簡単な サンプルの記述方法を教えてください。お願いします。

みんなの回答

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.3

COMについては、次のサイトが参考になると思います。 http://msdn.microsoft.com/en-us/library/aa139694.aspx > HRESULT型の正体はlong型なので、関数の戻り値をHRESULT型で定義すれば、longの値(0x00000000~0xffffffffの値)を返す事が出来る。 COM の仕様とは使い方が、違うので、そのやり方では、VBAやVBScriptからは呼び出せないかと思いますよ。 ActiveX では、戻り値の型をメソッドの最後のパラメタをポインタとして戻すって言うのは、 MSDNのリファレンスの通りです。 MIDLでインターフェイスを定義しておくと、VBAやVBScriptから呼び出した時に、 最後のパラメタを戻り値として使用できます。 呼び出し元が、C/C++の場合は、VBAやVBScriptから呼び出す時と、パラメタの使い方が違う事に注意。

vijareal
質問者

お礼

何度も回答をありがとうございます。 > MIDLでインターフェイスを定義 するには具体的にどうするのでしょうか? 参考ページを見て理解すべきとは思いますが、 できれば教えていただきたいです。

回答No.2

HRESULT型の正体はlong型なので、関数の戻り値をHRESULT型で定義すれば、longの値(0x00000000~0xffffffffの値)を返す事が出来る。 A.No1の回答を借りれば、     [id(1), helpstring("mtest1")]       HRESULT mtest1(             [in] long a); ---------------------------------------------------------------------- ソースは、 HRESULT __stdcall CDllTest::mtest1(long a) {   return a * 2; } で良い筈。 A.No1で、関数の戻り値をHRESULT型にしておきながら「return 0;」で0しか返してないのが意味不明過ぎる。 せっかく戻り値をHRESULT型にして、0x00000000~0xffffffffまでの値を返せるようにしたんなら、答えの返却場所を2番目の引数に与えたりしないで、素直に「return 答え;」ってやれば良いじゃないか。 A.No1の回答者さんは、何が言いたかったんだろう?理解に苦しむ。

vijareal
質問者

お礼

ご回答ありがとうございます。 chie65535さんの記述通りに  return a*2: としましたが、VBAから値を受け取れませんでした。 難しいです。

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

インターフェイスの定義を次の様にして、     [id(1), helpstring("mtest1")]       HRESULT mtest1(             [in] long a,             [out, retval] long*); ---------------------------------------------------------------------- ソースは、 HRESULT __stdcall CDllTest::mtest1(long a, long* pRetValue) {   if (pRetValue)   {     *pRetValue = a * 2;   }   return 0; } かな。 ---------------------------------------------------------------------- テストしていませんので、参考までにしてください。

vijareal
質問者

お礼

回答ありがとうございます。 上記コードで作成したmtest1メソッドの呼び出し側の記述はどうなるのですか?単純に set obj = CreateObject("dlltest.cl1") i = obj.mtest1(100) でiは200を受け取れなかったです。 [out,retval]long* という引き数を使う方法ではなく返り値を呼び出し側に渡す方法は ないでしょうか? 質問にあげたBASP21 DLLのメソッドのようにしたいのですが・・・

関連するQ&A