Saját dll létrehozása c-re a lua (in quik) (1. oldal) - külső könyvtárak írása c-re

Téma: Saját DLL létrehozása C ++-ban LUA-hoz (a QUIK-ban)

A saját .dll könyvtárak írása a C ++ -ba, hogy összekapcsolják őket a Lua kóddal (QLua), és felhívják a függvényeket ezekről a könyvtárakról

Most azonnal elmondom: nincs tervezett és nem lesz kimerítő leírás az LUA-C interakcióról. Csak azért, mert az interneten ilyen anyagot temettek el, nem mutatok be semmit.
Azonban szeretnék leírni azokat a lépéseket, amelyek lehetővé teszik a "gyors indítás" használatát a könyvtár írásakor, egyidejűleg rámutatva a projektbeállítások néhány nem nyilvánvaló árnyalatára.

Bizonyos értelemben fogok kezdeni "a végén."
Ha külső DLL könyvtárat szeretne LUA-hoz csatlakoztatni, a szkriptben meg kell adnia a sort:

Tehát tényleg C ++ -re megyünk.
Sikeres összeszereléséhez feltétlenül szükségünk lesz az alábbi fájlokra az LUA kézbesítéséről (a teljes összeállítás elérhető a lua.org-on)

Az első három fájl tartalmazza az LUA interfészfunkciók típusainak és prototípusainak leírását, a negyedik pedig a lua5.1.dll külső könyvtárának statikus összekapcsolására szolgáló könyvtár.

Nyissa meg az MS Visual Studio programot, hozzon létre egy új DLL projektet.
Minden konfiguráció projekt tulajdonságaiban, amelyeket összegyűjtünk (általában Release és Debug), hozzá kell adnunk a lua5.1.lib könyvtárat a további könyvtárakhoz. A csatolt példában a contrib almappában található:

Saját dll létrehozása c-re a lua (in quik) (1. oldal) - külső könyvtárak írása c-re

Nyissa meg projektünk cpp-fájlját. Először hozzáadjuk hozzá az LUA fejlécfájlokat és hozzáadjuk őket (ez fontos!) Két preprocesszoros változó definícióját adjuk hozzá: ezek szükségesek az LUA-tól elérhető DLL létrehozásához. Ha LUA-szkripteket futtató LUA-tolmácsot akarunk összegyűjteni, éppen ellenkezőleg, más fogalommeghatározásokra lenne szükség.

mert Számunkra egy C ++ fájlkezelővel az LUA fejléc fájlok fájlkapcsolatát külső "C" alatt kell végrehajtani.

Ahelyett, LUA_LIB és LUA_BUILD_AS_DLL keresztül #define direktíva, akkor add hozzá a előfeldolgozó meghatározások karakterláncot a projekt tulajdonságait (hasznos, ha a projekt sok fájlt tartalmaz):

Saját dll létrehozása c-re a lua (in quik) (1. oldal) - külső könyvtárak írása c-re

Egy másik szempont.
Hogy nincs probléma a könyvtár átvitelével és használatával más számítógépeken (ha ilyen igény van), akkor célszerű statikus futási idővel összeállítani. a tényleges C ++ könyvtárak kódja teljes egészében beletartozik a DLL-be. Ez kissé megnöveli méretét, de ki törődik a fájl méretével? Válaszolok: senki sem. De nem kell a könyvtárhoz hozzáadnia több rendszer DLL húzását, vagy kényszeríteni a felhasználókat a C ++ Redistributable Package és egy bizonyos verzió telepítésére. Nem akarsz önmagad és más nehézségeket létrehozni? és így van, így a statikus futásidő a mi módunk.
Ennek engedélyezéséhez a következő beállításokat kell elvégeznie a projekt tulajdonságaiban. A konfigurációtól függően meg kell adnia a megfelelő típusú futtatási időt # 'a, különben a hibakeresés nem hibakeresés, és a kiadás nem érti ezt.

A release-konfigurációkhoz a következőket választjuk:

Saját dll létrehozása c-re a lua (in quik) (1. oldal) - külső könyvtárak írása c-re

A hibakeresési konfigurációkhoz a következőket választjuk:

Saját dll létrehozása c-re a lua (in quik) (1. oldal) - külső könyvtárak írása c-re

Most a tényleges C + + könyvtárkód

mert A könyvtárat luacdll-nek hívtuk, és nevünket neveztük el. könyvtárunk betöltésekor az LUA értelmező egy meghatározott névvel, ebben az esetben luaopen_luacdll () fogja keresni a hozzá tartozó függvényt. Itt a luaopen_ egy előre meghatározott előtag (lásd a dokumentációt), és a luacdll könyvtárunk neve. Természetesen a funkció típusa és érvei is előre definiáltak.

Tény, hogy minden, amit csinálunk, itt - ez regisztrálni a LUA-tolmács (hívja luaL_openlib) azokat a funkciókat, hogy mi biztosítja a könyvtárunkban, ami elérhetővé teszi őket egy hívást a LUA-szkripteket. A függvény második paramétere a névtér, amelyben könyvtárunk funkciói elérhetők lesznek, amikor hívjuk őket; Az összetévesztés elkerülése érdekében a névtér megegyezik a könyvtár nevével.

A legegyszerűbb könyvtárunkban a LUA által rendelkezésre bocsátott 3 funkció valósul meg:

GetCurrentThreadId - kapja meg az aktuális téma azonosítóját

MultTwoNumbers - két számot szimulál mint argumentumot

MultAllNumbers - az összes argumentum számát megszorozza

A függvények listáját (neve és mutatója a megfelelő C-függvényhez) az állandó tömbben írja le:

Az aktuális végrehajtás, például olyan függvény, amely az aktuális szál azonosítóját visszaküldi:

A prototípus előre definiált és egységes az összes interfészfunkció esetében: egyetlen L paramétert tartalmaz - mutató az LUA veremhez (lásd a dokumentációt).
Ebben az esetben a függvény nem tartalmaz argumentumokat, és egyetlen egész számot ad vissza.

Összeállításuk után (mint említettük) Get DLL-fájl másolni a könyvtárba, ahol a terminál QUIK (szükséges átírni ugyanazt lua5.1.dll fájlt!), És futtatni a következő LUA script mentésével fájlként :

A végrehajtás eredményeként 3 üzenet jelenik meg: a terminál főáramának azonosítójával, a 12.152 számmal és az 1.1-es számmal.

Teljesen hasonló szövegek és fordított dll letölthető archívumként.

Re: Saját DLL létrehozása C ++-ban LUA-hoz (QUIK-ban)

Hol helyezze el a fájlt a DLL-könyvtárba?

Erősen ajánlom a DLL-t, melyet a QUIK-ba kell helyezni a könyvtárba. ugyanabban a mappában, mint az info.exe fájl.
Igen, elvileg játszhatsz a forgatókönyv utasításai között, és ez a megfelelő képességekkel is működik. De miért? Van legalább egy hangos érv? Az esztétika talán jó, de a megbízhatóság - véleményem szerint - 3 nagyságrenddel minimálisan meghaladja az esztétikát.
Ezért ne habozzon elhelyezni a DLL-könyvtárakat a katalógusban a QUIK-val - és mindannyian egyszerűen és megbízhatóan fog működni.

Re: Saját DLL létrehozása C ++-ban LUA-hoz (QUIK-ban)

Ie valójában a probléma megoldására egy külön alkalmazás fog működni a C #-ben, ami kölcsönhatásba lép a Lua szkripttel, ugye? Mint ilyen, nincs szüksége dll-re a C # -re.

Ami a "felszállást" illeti,
Friends! Ingyen csinálok amit érdekel. Már van lelkiismerete.

Kapcsolódó cikkek