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“:
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:
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ă:
Figura 3. Win32 Application Wizard, n Setarea proprietăților aplicației
Rezultatul va fi un proiect de gol:
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ă:
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:
- 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: - 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.
rezultat:
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.