前の質問への回答で、(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 のインスタンスとして解釈されます。