2

前の質問への回答で、(C++) xll で定義された関数を登録せずに呼び出す方法を見つけました。以前は XLW が提供する登録インフラストラクチャを使用しており、XlfOper 型を使用して VBA と xll の間で引数を渡していました。

C++ 関数は次のようになります。

extern "C" {
LPXLOPER EXCEL_EXPORT a_function(XlfOper arg1, XlfOper arg2);
}

以前のソリューションへの回答に続いて、次のような関数を直接宣言しています。

Declare Function an_exported_function Lib "MyDrive:\MyPath\myxll.xll"_
          Alias "a_function" (arg1 As Object, arg2 As Object) as Object

Excel プロセスにアタッチすると、関数が呼び出されていることがわかりますが、引数にガベージまたは null データが含まれています。これは、正しいデータ型に変換する方法を VBA に伝えていないことが原因だと思います。

XlfOper 引数を正しく呼び出すにはどうすればよいですか? xlw は次のように述べているため、LPXLOPER を呼び出すとうまくいくと思います。

このクラスにはデータ メンバーや仮想関数を追加しないことが重要です。xlw の設計は、クラス XlfOper が LPXLOPER/LPXLOPER12 と同じサイズであるという事実に依存しています。この仮定により、Excel から受け取った型の値がライブラリによって XlfOper のインスタンスとして解釈されます。

4

1 に答える 1

1

いくつかの調査の後、私はそれを見つけました:ユーザー定義型の受け渡し

MSDN の書き込み: 多くの DLL 関数では、定義済みの形式を使用してデータ構造を渡す必要があります。VBA から DLL 関数を呼び出すときは、関数の要件に従って定義したユーザー定義型を渡します。

したがって、XlfOper データ構造を定義する必要があります ;)

于 2014-01-08T17:10:04.837 に答える