Discussione su "Come scrivere una DLL per MQL5 e scambiare dati in 10 minuti". - pagina 6

 
GarF1eld:
Usarewchar_t invece di char

Il problema sta nel mql stesso.

 
_DLLAPI void __stdcall demo(char *stream, char *buf){ buf=stream;}

Che tipo di codice è questo? Copiare un puntatore è solo copiare 4 byte di memoria che contengono l'indirizzo.

In questo caso, memcpy può aiutarvi, se vi occupate prima dell'allocazione del buffer necessario nella linea ricevente (nel programma MQL5).

 
stringo:

Che tipo di codice è questo? Copiare un puntatore è solo copiare 4 byte di memoria che contengono l'indirizzo.

In questo caso, memcpy può aiutarvi, se vi prendete cura dell'allocazione del buffer richiesto nella linea ricevente (nel programma MQL5).

Cosa c'entra il puntatore? Questo codice funziona perfettamente in mql4. Non dopo la migrazione a mql5.

Tutti qui stanno dando consigli, ma vorrei che uno mostrasse un esempio davvero buono di come passare la stringa da mql5 alla funzione dll.

 
antonix
:

...

Domanda

Qual è il problema? Come passare umanamente una stringa da MQL a dll?

1) Grazie per il suo messaggio. L'errore è stato corretto. Si prega di attendere un aggiornamento.

2) Ti è stato detto correttamente di wchar _t - le stringhe in MQL5 sono Unicode.

3) Cosa intendi per "Quando si controlla in visual debug"?

4) Questo è il modo corretto di usarlo:

//--- нужно обеспечить буфер строки для заполнения его в DLL
StringInit(b,256);
//--- вызываем DLL функцию
demo("test",b);
//--- печатаем результат
Print(b);

//--- в DLL
_DLLAPI void __stdcall demo(wchar_t *stream, wchar_t *buf)
  {
   //--- проверим указатель
   if(stream==NULL || buf==NULL) return;
   //--- максимум 256 символов
   wcsncpy(buf,stream,256);
  }
 

Grazie per aiutare i programmatori in difficoltà come me. :) Il tuo esempio ha portato un po' di chiarezza nella mia situazione.

Ho deciso di scrivere (o ottavo, chi può averne bisogno) una funzione per convertire la stringa da wchar_t al buon vecchio char. Questa funzione può essere utile a coloro i cui progetti hanno molto codice che utilizza il tipo char. E poiché MQL5 passa solo wchar_t, è più facile convertire in ingresso che riscrivere metà del codice della dll.

char* w2char(wchar_t* str){
      unsigned int lenght = wcslen(str)+1;
      char* ansi = new char[lenght];
      wcstombs(ansi, str, lenght);
      return ansi;
}
 
antonix:

Grazie per aiutare i programmatori in difficoltà come me. :) Il tuo esempio ha portato un po' di chiarezza nella mia situazione.

Ho deciso di scrivere (o ottavo, chi può averne bisogno) una funzione per convertire la stringa da wchar_t al buon vecchio char. Questa funzione può essere utile a coloro i cui progetti hanno molto codice che utilizza il tipo char. E poiché MQL5 passa solo wchar_t, è più facile convertire in ingresso che riscrivere metà del codice della dll.

Le funzioni DLL che accettano stringhe come char *, naturalmente, prendono un puntatore al primo elemento dell'array di tipo char. Questo significa che quando si descrive l'importazione di tali funzioni nel programma MQL5, dovremmo usare l'array di char come parametro stringa.

Per questi casi, abbiamo fornito la funzione StringToCharArray che converte correttamente le stringhe nell'alfabeto nazionale. La funzione wcstombs non lo fa sempre correttamente.

 

L'articolo è interessante e utile.

1) Il fatto che il codice sorgente sia incluso è bello. Heh, ma dov'è la DLL compilata? Ovviamente, non è un problema per un Megaproger crearla.

Ma se non sono un Mega e non sono un Proger?! :)

2) L'articolo usa un compilatore MS. Non sono amichevole con esso:) Ho BC++. Puoi postare il codice sorgente sintonizzato su di esso?

(IMHO, probabilmente, è sempre meglio postare fonti per MS e BC, sono due aziende leader, ma i loro stili di scrittura sono diversi).

 

Cerchiamo di non postare codice potenzialmente pericoloso (DLL) per non rendere nervosi gli utenti. Inoltre, questo è solo un esempio di prova.

Purtroppo non ho a portata di mano il compilatore Borland C++. Provate ad adattarlo voi stessi, è meno di una pagina di codice.

 

yu-sha:

Gli sviluppatori non stanno puntando troppo in alto?

E perché reinventare la ruota quando tutto è già stato fatto molto tempo fa (C, Delphi, ...)?

Sono assolutamente d'accordo. Per me, per esempio, un'interfaccia COM ben congegnata o, nel quadro della strategia di sviluppo esistente verso FXRobot Developer Studio;-), almeno la possibilità di passare un puntatore alla funzione MQL5 Call Back nella DLL sarebbe abbastanza. Potrei sbagliarmi, ma finora ho l'impressione che le funzioni possano essere esportate solo per uso interno. Penso che dobbiamo tornare con i piedi per terra e capire che MT come ambiente di sviluppo non si avvicinerà mai a Borland Delphi(Embarcadero RAD Studio), Visual Studio e molti altri. Non è a causa del talento degli sviluppatori, ma a causa delle enormi risorse richieste per lo sviluppo di un IDE moderno. Non parlo dell'enorme supporto delle suddette piattaforme da parte di venditori terzi e altre cose. Prima di tutto, vorrei vedere gli sforzi degli sviluppatori per creare un'interfaccia utente perfetta, funzionalità standard e la possibilità di usare MQL per implementare un ponte tra i programmi utente e il server, dove i programmi in MQL fungeranno da driver. Non fraintendetemi, non voglio togliere il gioco preferito dei programmatori principianti, ma mi sembra che i programmatori professionisti e i commercianti che vogliono ottenere una perfetta soluzione pronta, piuttosto che un costruttore fai da te, dovrebbero ricevere un po' più di attenzione.
 

Non si dovrebbe fare ciò che sembra giusto, ma ciò che è benefico. Perché redditizio è ciò che è giusto. E in questo caso (MT5+MQL5+servizi) - un enorme profitto (sarà ripagato decine o centinaia di volte) per MetaQuotes e un enorme profitto per i trader. Solo non subito.

È sempre una buona idea guardare in lungo e in largo per almeno 5 anni. MetaQuotes ha fatto proprio questo.

Motivazione: