Pergunta

Eu tenho uma função específica em um addin Excel (xll). O Addin é proprietário e não temos acesso ao código -fonte. No entanto, precisamos chamar algumas funções contidas no Addin e gostaríamos de chamá -lo de um programa C#.

Atualmente, eu estava pensando em escrever uma interface C ++ chamando a função do Excel com Xlopers e, em seguida, chamando essa interface C ++ de C#.

Alguém que tem experiência anterior com esse tipo de problema sabe qual seria a melhor solução para isso?

Anthony

Foi útil?

Solução

Você precisa criar um xlcall32.dll falso, coloque -o no mesmo diretório que o seu XLL (não coloque o próprio XLCall32.dll do Excel no caminho). Aqui está algum código:

# 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;}

Agora, suponha que eu tenha um xll chamado xll-dll.xll com uma função chamada (use "dependes.exe" para descobrir os nomes das funções exportadas) xladd que bem adiciona duas duplas: extern "c" __declspec (dllexport) xloper * __cdecl xladd (xloper* pa, xloper* pb);

O código a seguir chama:


# 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();}

Meu exe realmente funciona (para minha própria surpresa) e a saída 3 como esperado. Você deve ter algum conhecimento do que seu XLL realmente espera para os parâmetros. Se ele alocar alguma memória, você deverá verificar se o #Define XlbitdllFree 0x4000 está definido no seu tipo XLOPER C-> e ligue de volta "xlautofree".

Outras dicas

Você pode tentar o XLL Plus http://www.planatechsolutions.com/xllplus/default.htm. É um pouco caro, mas o recurso XLL Wrapper Libraries é exatamente o que você está procurando:

"Às vezes é útil poder chamar suas funções de suplemento do Excel de outros ambientes, como programas de linha de comando ou aplicativos interativos, escritos em C ++, Java, C# ou Visual Basic. O XLL Wrapper Toolkit contém ferramentas, um tempo de execução Biblioteca, amostras e documentação para ajudar no desenvolvimento de módulos COM e conjuntos .NET que envolvem complementos do Excel XLL "

Uma DLL da Excell pode ser escrita em C#. Nesse caso, você provavelmente pode ignorar completamente o Excel. Pode precisar de um invólucro.

Verifique se o conjunto está disponível nos arquivos de programas em que você instala o PLGUIN, faça referência a esse conjunto diretamente ao seu projeto C# - verifique o navegador de objeto para sua classe, método ou objeto

Você deve poder usar a reflexão para obter acesso ao seu add. tente usar O refletor Para ver o que está disponível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top