Cum de a scrie o bibliotecă dll timp de 10 minute pentru a MQL5 date de articol și distribuiți în MQL5

Doar așa se întâmplă că acum, puțini dezvoltatori amintesc cum sa scrie un DLL simplu, și ce particularități sisteme disparate de legare.

Pornește prin intermediul expertului „File -> New“ meniu, selectați tipul de proiect „Visual C ++“, șablon „Win32 Console Application“ și introduceți un nume de proiect (de exemplu, „MQL5DLLSamples“). Selectați un singur director rădăcină de „Locul de amplasare“ proiecte de stocare în locul implicit propus, dezactivați caseta de validare „Creare director pentru soluție“ și faceți clic pe butonul „OK“:

Cum de a scrie o bibliotecă dll timp de 10 minute pentru a MQL5 date de articol și distribuiți în MQL5

Figura 1. Application Wizard Win32, stabilirea proiectului DLL

În etapa următoare, pur și simplu faceți clic pe butonul „Următor“ pentru a merge la pagina de setări:

Cum de a scrie o bibliotecă dll timp de 10 minute pentru a MQL5 date de articol și distribuiți în MQL5

Figura 2. Win32 Application Wizard, parametrii proiectului

selectați tipul „DLL“ de pe ultima pagină, și lăsați celelalte câmpuri goale în care acestea sunt și faceți clic pe „Finish“. Pune o bifă în „simbolurile de export“ nu au nevoie, astfel încât să nu ștergeți adăugate în mod automat codul de probă:

Cum de a scrie o bibliotecă dll timp de 10 minute pentru a MQL5 date de articol și distribuiți în MQL5

Figura 3. Win32 Application Wizard, n Setarea proprietăților aplicației

Rezultatul va fi un proiect de gol:

Cum de a scrie o bibliotecă dll timp de 10 minute pentru a MQL5 date de articol și distribuiți în MQL5

Figura 4. Proiect DLL gol

Pentru comoditate, cel mai bine este de a testa în mod direct în Output Directory «setările pentru a indica DLL de stabilire a deschide fișierul direct în directorul». \ Terminalul client MQL5 \ Biblioteci. Acest lucru va salva o mulțime de timp în activitatea ulterioară:

Cum de a scrie o bibliotecă dll timp de 10 minute pentru a MQL5 date de articol și distribuiți în MQL5

Figura 5. Produs fișiere DLL calcule

2. Pregătirea pentru adăugarea de caracteristici

Adauga „_DLLAPI“ macro la sfârșitul fișierului stdafx.h. astfel încât să puteți convenabil și pur și simplu să descrie funcțiile exportate:

În funcție de MQL5 apeluri folosind __stdcall legături acord și __cdecl. Cu toate apelurile stdcall și cdecl diferite variante de realizare extragerea parametrilor din stivă, dar performante de mediu MQL5 permite nedureroase de a utiliza atât datorită speciale apeluri înveliș DLL.

În mod implicit, setările compilatorul C ++ pentru funcțiile utilizate __cdecl, dar am recomanda pentru funcțiile exportate specifică în mod explicit __stdcall modul.

Funcția de export regulată trebuie să aibă următoarele:

așa cum este descris în programul MQL5 și numit ca aceasta:

După asamblare, stdcall proiect DLL această funcție va fi vizibilă în tabelul de export numit _fnCalculateSpeed ​​@ 8. în cazul în care compilatorul adaugă o subliniere și cantitatea de date transmise prin stivă în octeți. O astfel de decor face mai ușor de controlat DLL solicită caracteristici de securitate, datorită faptului că apelantul știe exact cât de multe (dar nu orice!), Trebuie să pună datele pe stivă.

În cazul în care descrierea funcției DLL este o eroare în valoarea finală a blocului de parametri, funcția nu va fi numit, iar revista va fi un mesaj de genul „Nu se poate găsi“ fnCrashTestParametersStdCall „in“ MQL5DLLSamples.dll „“. În acest caz, este necesar să se verifice cu atenție toți parametrii în funcție de la căldură, și în cele mai multe DLL.

În lipsa denumirii complete a funcției în tabelul de export utilizate pentru căutare de compatibilitate descriere simplificată, fără decor. Astfel de nume precum fnCalculateSpeed ​​create cu descrieri ale funcțiilor în formatul __cdecl:

3. Metode de parametrii de transmisie și a schimbului de date

Să ne uităm la mai multe opțiuni pentru parametrii care urmează să fie trecut:

  1. Primirea și transmiterea variabilelor simple,
    Cu simple variabile, totul este simplu - acestea pot fi transmise prin valoare sau prin referință prin .
    Call of MQL5:
    rezultat:
  2. Primirea și transmiterea matrice cu elementele de umplere

Se transferă matrice în DLL, spre deosebire de alte MQL5-programe, este prin referire directă la buffer-ul de date fără a avea acces la informații de proprietate cu privire la dimensiunile și dimensiunile. Prin urmare, dimensiunea și dimensiunea matrice ar trebui să fie transmise separat.

Call of MQL5:
rezultat:
  • Liniile de transfer și de modificare
    Liniile (unicod), sunt, de asemenea, transferate prin intermediul link-uri directe la locul de muncă, fără a tampoane informații deasupra capului. Vă rugăm să rețineți că funcția, de exemplu, este descrisă în formatul cdecl:
    Call of MQL5:
    rezultat:
    Sa dovedit faptul că rândul nu sa schimbat! Aceasta este o greșeală comună făcută de către programatori novice atunci când acestea transmit copii ale obiectelor (un șir - un obiect) în loc să facă referire la acestea. Pentru copia șir de „textul“ este creat în mod automat, care a fost modificat în DLL, și apoi o copie este șters automat, fără a afecta originalul.

    Pentru a remedia această situație, este necesar să se treacă un șir de caractere de referință. Pentru a face acest lucru, pur și simplu modificați fluxul de importuri, adăugând semn la textul parametrului:
    După recompilarea și rulează vom obține rezultatul corect:

    4. Interceptarea excepții la funcțiile DLL

    Pentru a evita căderea terminalului, fiecare apel este protejat automat înveliș funcții de excepție DLL nemanipulabilă. Acest mecanism vă permite să vă protejați de cele mai multe standard de eroare (trimitere la o memorie inaccesibile, diviziune cu zero, etc.)

    Pentru a testa eficiența acestui mecanism va crea următorul cod:

    și-l numesc de la terminal:


    5. Wrapper DLL solicită și rata de pierdere de apel

    Așa cum a fost descris mai sus, pentru siguranță fiecare apel o funcție DLL este înfășurat într-un înveliș special. Aceasta leagă măști codul de bază, stivă substitut sprijină acordurile stdcall / cdecl și monitorizează excepțiile din interiorul numite funcții.

    O astfel de cantitate de muncă nu încetini în mod semnificativ în jos un apel funcții.

    6. Asamblarea finală

    Vă mulțumesc pentru atenție! Voi fi bucuros să răspundă la întrebări.