سؤال

لدي وظيفة معينة في addin excel (XLL). الإضافة ملكية خاصة وليس لدينا حق الوصول إلى الكود المصدري. ومع ذلك ، نحتاج إلى استدعاء بعض الوظائف الموجودة في الإضافة ونود أن نسميها من برنامج C#.

حاليًا ، كنت أفكر في كتابة واجهة C ++ التي تستدعي وظيفة Excel مع Xlopers ، ثم استدعاء واجهة C ++ هذه من C#.

هل يعرف أي شخص لديه خبرة سابقة في هذا النوع من القضايا ما هو الحل الأفضل لذلك؟

أنتوني

هل كانت مفيدة؟

المحلول

تحتاج إلى إنشاء ملف مزيفة xlcall32.dll, ، ضعه في نفس الدليل مثل XLL الخاص بك (لا تضع XLCALL32.DLL الخاص بـ Excel في المسار). هنا بعض التعليمات البرمجية:

# 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 يسمى XLL-dll.xll مع وظيفة تسمى (استخدم "comps.exe" لمعرفة أسماء الوظائف المصدرة) __cdecl xladd (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 Plus http://www.planatechsolutions.com/xllplus/default.htm. إنها ثمن بعض الشيء ، لكن ميزة مكتبات XLL هي بالضبط ما تبحث عنه:

"في بعض الأحيان يكون من المفيد أن تكون قادرًا على استدعاء وظائف الإضافة إلى Excel من بيئات أخرى ، مثل برامج خط الأوامر أو التطبيقات التفاعلية ، المكتوبة في C ++ أو Java أو C# أو Visual Basic. تحتوي مجموعة أدوات Wrapper XLL على أدوات ، وقت تشغيل المكتبة والعينات والوثائق للمساعدة في تطوير وحدات COM و .NET مجموعات التي تفتت الإضافات Excel XLL "

قد يتم كتابة الوظيفة الإضافية التميز DLL في C#. إذا كان الأمر كذلك ، فربما يمكنك تجاوز Excel تمامًا. قد تحتاج إلى غلاف رغم ذلك.

تحقق مما إذا كانت التجميع متوفرة في ملفات البرنامج حيث تقوم بتثبيت plguin ، المرجع إلى التجميع مباشرة إلى مشروع C# - تحقق من متصفح الكائن لفصلك أو الطريقة أو الكائن

يجب أن تكون قادرًا على استخدام التفكير للوصول إلى الإضافات الخاصة بك. جرب استخدام العاكس لمعرفة ما هو متاح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top