Crearea propriului dll pe c pentru lua (în quik) (pagina 1) - scrierea de biblioteci externe în c

Subiect: Crearea propriului DLL în C ++ pentru LUA (în QUIK)

Scrierea propriul .dll-bibliotecă în C ++ pentru conectarea acestora la codul Lua (QLua) și apelul funcțiilor acestor biblioteci

Voi spune imediat: nu există planificat și nu va exista o descriere exhaustivă a interacțiunii LUA-C. Doar pentru că astfel de materiale de pe Internet sunt doar îngropate, nu voi dezvălui nimic nou.
Cu toate acestea, aș dori să ofer o descriere a pașilor care vă permit să faceți o "pornire rapidă" în scrierea bibliotecii dvs., subliniind simultan câteva nuanțe neobișnuite ale setărilor proiectului.

Voi începe într-un sens "de la sfârșit".
Pentru a conecta o bibliotecă DLL externe la LUA, în script este necesar să introduceți linia:

Deci, de fapt mergem la C ++.
Pentru asamblarea cu succes, vom avea cu siguranță nevoie de următoarele fișiere din livrarea LUA (compilația completă este disponibilă pe lua.org)

Primele trei fișiere conțin o descriere a tipurilor și prototipurilor funcțiilor de interfață LUA, a patra este biblioteca pentru legarea statică cu biblioteca externă a interpretului lua5.1.dll.

Deschideți MS Visual Studio, creați un nou proiect DLL.
În proprietățile proiectului pentru toate configurațiile, pe care le vom colecta (de obicei, Release and Debug), trebuie să adăugați biblioteca lua5.1.lib la bibliotecile suplimentare. În exemplul atașat, se află în subfolderul contrib:

Crearea propriului dll pe c pentru lua (în quik) (pagina 1) - scrierea de biblioteci externe în c

Deschideți fișierul cpp al proiectului nostru. Inițial, adăugați-l fișiere antet Lua, și pentru a le activa (acest lucru este important!) Adăugați o definiție a celor două variabile, preprocesorul: acestea sunt necesare pentru cazul de asamblare DLL, disponibil de la LUA. Dacă am merge invers-interpret care ruleaza LUA de la sine Lua-script-uri, va trebui să facă alte definiții.

pentru că La noi o conexiune de fișiere C ++ a fișierelor de antet LUA trebuie făcută sub extern "C".

In loc de a defini LUA_LIB și LUA_BUILD_AS_DLL prin Directiva #define, aveți posibilitatea să le adăugați la șirul Preprocessor Definiții în proprietățile proiectului (utilă în cazul în care proiectul conține mai multe fișiere):

Crearea propriului dll pe c pentru lua (în quik) (pagina 1) - scrierea de biblioteci externe în c

O altă considerație.
Că nu aveți probleme cu transferul și utilizarea bibliotecii dvs. pe alte computere (dacă există o astfel de nevoie), atunci este logic să o compilați cu un timp de execuție static, adică tot codul bibliotecilor actuale C ++ va fi complet în interiorul DLL-ului. Acest lucru va crește ușor dimensiunea sa, dar cine are grijă de dimensiunea fișierului? Voi răspunde: nimeni. Dar nu trebuie să adăugați suplimentar la bibliotecă pentru a trage mai multe DLL-uri de sistem sau pentru a forța utilizatorii să instaleze pachetul C ++ Redistributable și o anumită versiune. Nu doriți să vă creați pe voi înșivă și pe alții alte dificultăți? și dreapta, așa că timpul de execuție statică este calea noastră.
Pentru ao activa, trebuie să faceți următoarele setări în proprietățile proiectului. În funcție de configurație, trebuie să selectați tipul corect de execuție # 'a, altfel depanarea nu va fi depanată, iar lansarea nu înțelege că.

Pentru configurațiile de lansare alegem:

Crearea propriului dll pe c pentru lua (în quik) (pagina 1) - scrierea de biblioteci externe în c

Pentru configurațiile de depanare alegem:

Crearea propriului dll pe c pentru lua (în quik) (pagina 1) - scrierea de biblioteci externe în c

Acum, codul actual al bibliotecii C ++

pentru că Am sunat la biblioteca luacdll și ne-am cerut să numim acest nume. atunci când încărcăm biblioteca, interpretul LUA va căuta funcția exportată de la ea cu un nume specific, în acest caz luaopen_luacdll (). Aici luaopen_ este un prefix predefinit (a se vedea documentația), iar luacdll este numele actual al bibliotecii noastre. Desigur, tipul și argumentele acestei funcții sunt, de asemenea, predefinite.

De fapt, tot ceea ce facem aici - se înregistra în-interpret LUA (prin apelarea luaL_openlib), acele funcții pe care le oferim din biblioteca noastră, ceea ce le face accesibile unui apel de la Lua-script-uri. Al doilea parametru a trecut la spațiul de nume funcției, care va fi disponibil la apelul nostru funcție de bibliotecă; Pentru a evita confuzia, spațiul de nume se potrivește cu numele bibliotecii.

În biblioteca noastră simplă, vor fi implementate 3 funcții disponibile de la LUA:

GetCurrentThreadId - obțineți ID-ul firului curent

MultTwoNumbers - multiplică 2 numere specificate ca argumente

MultAllNumbers - înmulțește toate numerele întâlnite în argumente

Lista funcțiilor (numele și pointerul la funcția C corespunzătoare) este descrisă în matricea constantă:

Implementarea reală, de exemplu, a unei funcții care returnează ID-ul firului curent:

Prototipul său este predeterminat și aceeași pentru toate funcțiile de interfață: ia un singur parametru L - un pointer la stiva LUA (a se vedea documentația.).
În acest caz, funcția nu implică argumente și returnează o singură valoare întregă.

După compilare (așa cum sa menționat) Get DLL-fișier este copiat în același director în care Quik terminalul (necesar pentru a rescrie același fișier lua5.1.dll!), Și rulați-l următorul script-prin LUA salvându-l ca fișier :

Ca urmare a execuției sale, vor fi afișate 3 mesaje: cu ID-ul fluxului principal al terminalului, numărul 12.152 și numărul 1.1.

Texte complet similare și dll compilate pot fi descărcate ca o arhivă.

Re: Crearea propriului DLL în C ++ pentru LUA (în QUIK)

Unde se pune fișierul cu biblioteca DLL

Vă recomandăm să creați DLL-ul care să fie plasat în director cu QUIK, adică în același folder ca fișierul info.exe.
Da, în principiu, puteți juca cu instrucțiunile din scenariu și acest lucru chiar funcționează cu priceperea corespunzătoare. Dar de ce? există cel puțin un argument solid? Estetica - poate fi și bun, dar fiabilitatea - este, în opinia mea, mai importante decât orice estetice cel puțin 3 ordine de mărime.
Deci, nu ezitați să plasați bibliotecile dvs. DLL în catalog cu QUIK - și veți lucra simplu și fiabil.

Re: Crearea propriului DLL în C ++ pentru LUA (în QUIK)

Ie de fapt, pentru o soluție a problemei, o aplicație separată în C # va funcționa bine, care va interacționa cu scriptul Lua, nu-i așa? Ca atare, nu aveți nevoie de un DLL pe C #.

În ceea ce privește "decolarea",
Prieteni! Gratuit ce fac ce ma interesează. Ai deja o conștiință.

Articole similare