質問

私は、Excelのアドイン(XLL)で特定の機能を持っています。 アドインは、独自に開発したものであり、私たちは、ソースコードへのアクセスを持っていません。しかし私たちは、アドインに含まれるいくつかの関数を呼び出す必要が、我々は、C#プログラムから呼び出すしたいと思います。

現在、私はC#からこのC ++インタフェースを呼び出し、その後、xlopersでExcelの関数を呼び出すC ++インタフェースを書くことを考えていた。

問題のこの種の経験を持っている誰もがそのための最善の解決策になるか知っていますか?

アンソニー

役に立ちましたか?

解決

あなたは(PATHにExcelの自身のxlcall32.dllを入れないでください)、のを偽xlcall32.dllを作成し、あなたのXLLと同じディレクトリに配置する必要があります。ここではいくつかのコードは次のとおりです。
# include <windows.h>

typedef void* LPXLOPER;

extern "C" void __declspec(dllexport) XLCallVer ( ) {}

extern "C" int __declspec(dllexport) Excel4 (int xlfn, LPXLOPER operRes, int count,... ) { return 0; }

extern "C" int __declspec(dllexport) Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER far opers[]) {return 0;}
<時間>

今、私はXLLが良く2倍を追加xlAddを(エクスポートされた関数の名前を見つけるために使用「するDepends.exe」)と呼ばれる機能を持つXLL-dll.xll呼ばれていたとします。 extern "C" __declspec(DLLEXPORT)xlAdd __cdecl XLOPER *(XLOPER * PA、XLOPER * PB);

次のコードは、それを呼び出します:

<時間>
# include <windows.h>
# include <iostream>

// your own header that defines XLOPERs
# include <parser/xll/xloper.hpp>

// pointer to function taking 2 XLOPERS
typedef XLOPER * (__cdecl *xl2args) (XLOPER* , XLOPER* ) ;

void test(){
/// get the XLL address
HINSTANCE h = LoadLibrary("xll-dll.xll");
if (h != NULL){
xl2args myfunc;
/// get my xll-dll.xll function address
myfunc = (xl2args) GetProcAddress(h, "xlAdd");
if (!myfunc) { // handle the error
FreeLibrary(h); }
else { /// build some XLOPERS, call the remote function
XLOPER a,b, *c;
a.xltype = 1; a.val.num = 1. ;
b.xltype = 1; b.val.num = 2. ;
c = (*myfunc)(&a,&b);
std::cout << " call of xll " << c->val.num << std::endl; }
FreeLibrary(h); }
}

int main()
{test();}
<時間>

私のexeファイルは、実際には(私自身の驚きに)動作し、出力3は予想通り。あなたのXLLが実際のパラメータのために期待するもののいくつかの知識を持っている必要があります。それはいくつかのメモリを割り当てる場合は、の#define xlbitDLLFree 0x4000のかどうかを確認しなければなりません あなたのXLOPERのC->タイプに設定され、「xlAutoFreeを」コールバックされます。

他のヒント

あなたはXLLを試してみたいことがありますプラス http://www.planatechsolutions.com/xllplus/ default.htmのに。それは少し高価ですが、  XLLラッパーライブラリの機能が正確であるあなたが探しているもの:

「時にはあなたのExcelのアドイン機能をC ++やJava、C#またはVisual Basicで書かれた、このようなコマンドラインプログラムまたは対話型アプリケーションなどの他の環境から呼び出すことができると便利です。XLLラッパーツールキットは、ツールが含まれています、ランタイムライブラリ、サンプルおよびラップエクセルXLLは、

「アドインをCOMモジュールと.NETアセンブリの開発を支援するためのドキュメント

エクセルは、アドインDLL C#で記述される可能性があります。もしそうなら、あなたはおそらく完全にExcelをバイパスすることができます。しかしラッパーが必要になる場合があります。

アセンブリはあなたがplguinをインストールするプログラムファイルで使用可能であるかどうかをチェックし、 アセンブリを直接あなたのC#プロジェクトへの参照 - あなたのクラス、メソッドまたはオブジェクトのオブジェクトブラウザをご確認ください。

あなたはあなたのアドインへのアクセスを取得するためにリフレクションを使用することができるはずです。利用できるものを見るために反射する noreferrer">

scroll top