Pergunta na DLL ...... - página 6

 
 
A questão ainda é relevante para o autor? Estou escrevendo um dll para mim mesmo, posso dar um pequeno exemplo.
 
É sim!!! Eu resolvi a dll graças a você! Obrigado! Mas há coisas que eu não consigo descobrir como colocá-las na dll!
 

As funções são chamadas de acordo com certas regras - convenção de chamadas. Para ter certeza de que a função exportada utiliza as regras acima mencionadas, ela deve ser assim: void __stdcall AnyFn();

2. Conheço duas maneiras de fazer exportação de funções de biblioteca - com __declspec(dllexport) e com arquivo def (é mais fácil, caso contrário você tem que lutar com a decodificação de funções além disso). Em VS para incluir o arquivo def no projeto, primeiro adicionar aos arquivos do projeto, depois adicionar o nome do arquivo a: propriedades do projeto/compositor/arquivo de definição de módulo/input/módulo.

P.S: Exemplo de projeto com arquivo def estão localizados em: diretório de terminais\samostraDLLSample.



 

PASSANDO PARÂMETROS PARA UMA FUNÇÃO DLL

1. Ao passar a variável string, um array de char (caracter ANSI, leva 1 byte) é passado para DLL.

#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}


2. Passar int ou duplo para a biblioteca fará com que a variável seja copiada, portanto, quando você muda a variável na dll, não há nenhuma mudança na dll:

#import "myLib.dll"

void fn(int var);

void fn(double var);

#import

DLL:

void __stdcall fn(int var) {}


3. Para poder mudar as variáveis int e o dobro das variáveis declaradas no MQL, as matrizes devem ser aprovadas:

#import "myLib.dll"

void fn(int var[]);

void fn(double var[]);

#import

DLL:

void __stdcall fn(int *var) {}

void __stdcall fn(double *var) {}


4. Ao passar um array de cordas, a estrutura MqlStr é passada para a DLL:

МКЛ прототип:

#import "myLib.dll"

void fn(string var[]);

#import

DLL:
struct MqlStr
{
   int len;
   char *string;
};

void __stdcall fn(MqlStr *var) {}


P.S.

Sempre que um array ou uma string (string) é passado para a DLL, na verdade é um ponteiro para uma seção de memória (ponteiro) que é passado para a biblioteca da seguinte forma

void __stdcall fn(int *pointer) {} // como este. Desta forma, você pode trabalhar como uma matriz, por exemplo, ponteiro[4] = 4.

void __stdcall fn(int &reference) {} // or so. Mas teremos acesso a apenas um item. É relevante quando se passa um conjunto de um item para a biblioteca.

 
#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}

Não consegui encontrar uma explicação adequada para o * na frente do ponteiro, para que serve? Não é possível passar sem ele ?????

E uma pergunta sobre como obter texto de uma dll ???

 
VOLDEMAR:

Não consegui encontrar uma explicação adequada para o * na frente do ponteiro, para que serve? Não é possível passar sem ele ?????

E uma pergunta sobre como obter texto de uma dll ???

Não é necessário obter texto a partir dele. Pelo menos não este ano.
 

1. Transferência de um fio para o IDC:

DLL:
#include <string.h>
void __stdcall Temp(char *mqlStr)
{
   size_t mqlStringSize = strlen(mqlStr);
   char stroka[] = "DLL string";          // Эту строку передадим в MQL.
   if(strlen(stroka) > mqlStringSize)
      stroka[mqlStringSize] = '\0';       // Добавляем нуль-терминатор (обозначает конец строки).
   strcpy(mqlStr, stroka);
   return;
}

MQL:
#include "WaveCounter.dll"
void Temp(string str);
#include
int start()
{ 
   string str = "wwwwwsff";    // Задаем длину строки; Если длина будет меньше необходимого, то строка будет урезана.
   Temp(str); 
   Alert(str); 
   return;
} 
2. O sinal * indica que se trata de um ponteiro. Em resumo, qualquer variável tem não só algum valor, mas também um endereço onde ela está localizada na memória. Os apontadores podem trabalhar com este endereço. Esta é uma questão que precisa ser bem compreendida, acho que você deveria conferir os livros em C++;
 
220Volt:

1. Transferência de um fio para o IDC:

2. O sinal * indica que se trata de um ponteiro. Em resumo, qualquer variável tem não só algum valor, mas também um endereço onde ela está localizada na memória. Os apontadores podem trabalhar com este endereço. É um assunto que precisa ser bem compreendido, por isso você pode querer conferir alguns livros em C++;
Isso é o que estou fazendo. Estou usando C++, assistindo vídeos, lendo livros. Agora muito do MKL 5 está se tornando claro .......
 

Você só precisa ter cuidado com os dados globais na biblioteca. Os programas MCL funcionam independentemente uns dos outros (mas compartilham variáveis globais porque estão na mesma linha), portanto é possível que vários scripts escrevam e leiam no mesmo local de memória (o que não é bom). Isto requer sincronização, por exemplo, usando seções críticas. Sublinho que isto é verdade para os dados globais (declarados funções externas). Quando funções são chamadas, é criado um conjunto próprio e independente de variáveis.