Ajuda a resolver um problema de importação de uma função a partir de uma dll - página 2

 

Eu meio que escrevi algo em um arquivo h


extern __declspec( dllexport) int __stdcall GetIntValue(int);

então no cpp apenas


int __stdcall GetIntValue(int)
 
Talvez a palavra-chave externa possa ajudar.
 
alsu >> :

...


...e prefiro não lidar de forma alguma com cordas... Por que você precisa deles em uma dll??? é apenas para a beleza?

E a própria Borland recomenda o uso de char* ou char[], no estilo Metatrader, se necessário.

 

Acho que a forma correta de declará-lo no construtor é a seguinte (não me lembro exatamente)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

 
GarF1eld >> :

Acho correto declarar no construtor algo como isto (não me lembro exatamente)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

exatamente lá!

 

Muito obrigado pelas dicas! Funcionou com este exemplo após "C" int __declspec(dllexport) __stdcall GetIntValue().

Eu experimentei com funções duplas e de corda, e funcionou também. Decidi aplicar os conhecimentos que adquiri de vocês a uma tarefa prática. Mas, infelizmente... Infelizmente, eu não tive sucesso.

Se você puder, por favor me ajude mais uma vez.

Existem arquivos no projeto Bilder para criação de DLL: UHsvd.h, Usvd.cpp e outros.

O arquivo UHsvd.h tem uma função que deve ser exportada posteriormente:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneed,
int adicionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt);

O arquivo Usvd.cpp contém a mesma função, que deve então ser exportada:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneed,
int adicionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt)

{

........

}

Eu começo a construir uma DLL em Bilder nesta variante, tudo "constrói", tudo funciona, sem erros.

Se eu começar a fazer mudanças em UHsvd.h, Usvd.cpp como

rmatrixsvd(ap::real_2d_array a,

.....), depois aparecem erros de 2 a 19 com diferentes variantes, ou seja, fiz esta declaração ou no arquivo de cabeçalho ou no cpp... embora, como eu entendo, deveria estar no arquivo de cabeçalho (então existem apenas 2 erros):

[Erro BCC32] Usvd.cpp(128): E2356 Tipo de descasamento na redeclaração de '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'
[Erro BCC32] UHsvd.h(111): E2344 Declaração anterior de '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'.

Pelo que entendi, há uma discrepância... Mas eu não entendo completamente... :-(

Realmente esperando por sua ajuda e apoio...

 

boysn писал(а) >> {...}

Se você puder, por favor, ajude mais uma vez.

Existem arquivos no projeto Bilder para criar uma DLL: UHsvd.h, Usvd.cpp e outros.

O arquivo UHsvd.h tem uma função que deve então ser exportada:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int, s.f,
int uneeded,
int vtneed,
int adicionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt); {...}

Se entendi corretamente, ap::real_1d_array é uma classe. E ap::real_1d_array & é uma referência a um objeto de classe.

Mas querida, você só pode passar o dobro de meus dados[] como parâmetros para o Dll,

que parecerá o dobro * em funções.

 
jartmailru писал(а) >>

Se entendi corretamente, ap::real_1d_array é uma classe. E ap::real_1d_array & é referência a objeto de classe.

Mas querida, apenas o dobro de myData[] pode ser passado para o Dll como parâmetro,

que em funções parecerá o dobro *.

Concordo plenamente com você. Vou declará-lo como duplo em MQL ao importá-lo. Mas no momento estou tendo problemas para criar a DLL em si no C++ Builder 2009. Eu recebo erros ao construí-lo. Se eu não usar a declaração

externo "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) então a compilação da biblioteca em Bilder passa com sucesso sem nenhum problema. Agora, eu não sei como criar corretamente funções de declaração de exportação no projeto Bilder :-(, a fim de obter

DLL de trabalho com capacidade de exportar a função rmatrixsvd.

 
boysn >> :

Concordo plenamente com você. Vou declará-lo como duplo em MQL ao importá-lo. Mas no momento estou tendo problemas para criar a própria DLL no C++ Builder 2009. Eu recebo erros ao construí-lo. Se eu não usar a declaração

externo "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) então a biblioteca se compila em Bilder com sucesso, sem problemas. Agora, eu não sei como criar corretamente as funções de declaração de exportação no projeto Bilder :-(, para obter

DLL de trabalho com capacidade de exportar a função rmatrixsvd.

Brrr. Você parece concordar comigo estranhamente.

.

Na verdade, estamos falando de escrever "adaptador" ou "ponte".

"Adaptador" do ponto de vista de que os parâmetros da função exportada

devem ser ajustados com os parâmetros que o metatrader pode passar,

ou seja, você precisa de uma função extra que passe a chamada para onde você quer que ela vá.

E "ponte" do ponto de vista de que não é necessário para a função

que o senhor declara que fará o trabalho por conta própria.

E vice versa - não é necessário chamar a função que faz o trabalho.

.

Ou seja, você precisa separar a interface e a implementação, ou seja, a implementação pode ser construída sobre classes

. e funções que estão fora do Dll que ninguém jamais conhecerá.

.

Mas vamos considerar um exemplo.

.

Você deve declarar uma função como esta:

externo "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)

// claro, você também passará aqui o número de filas e colunas.

{

//converter parâmetros de entrada para ap::real_2d_array

ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);

ap::real_2d_array a2 = ;

.

//calcule

ap::real_2d_array a3;

rmatrixsvd(a1, a2, a3);

.

//traduzir o resultado de a3 para fora

convertReal2DArrayToPDouble(a3, out);

.

retornar;
}

.

Aqui - é claro - a função rmatrixsvd

não é declarado como "C" ou __stdcall externo ou __declspec etc.

Porque faz parte da implementação interna e oculta.

 

Desculpe, infelizmente não entendi...

A partir de http://alglib.sources.ru/ eu baixei a implementação C++ (código) que eu preciso. Se você não se importa, por favor, dê uma olhada no arquivo 100KB anexo. Este algoritmo tem muitas funções auxiliares, o número total de linhas de código é algo como 3000 linhas... Eu acho que sim

Diz isso no site, ou seja, é demais, e é bastante difícil traduzi-lo para a MQL... É preciso entender o próprio algoritmo para traduzi-lo corretamente. No momento, é um pouco complicado para mim. É por isso que eu gostaria de usar o C++ Builder 2009 para fazer uma dll com este código pronto e chamar a função rmatrixsvd(...) que eu preciso da dll. Foi aí que eu fiquei perplexo... onde e como declará-lo corretamente... Com este código, sem mudar uma linha ali, a DLL é construída, sem erros. Mas assim que coloco o "C" externo bool __declspec(dllexport) __stdcall nele eu recebo erros...

Obrigado por seu tempo.

Arquivos anexados:
svdy1e.cpp.zip  94 kb