Olen nyt jonkin aikaa miettinyt, että miten luokan voi ladata DLL:stä ajon aikana. Olen löytänyt, että miten tehdä luokka DLL:ään. Mistään vaan ei löydy, että miten sitä käytetään ajon aikana. Olen löytänyt ohjeet missä neuvotaan miten luokkia käytetään linkityksen avulla, mutta se ei ole käyttötarkoitukseen sopiva.
Ensimmäinen google sivu kertooo....
http://edn.embarcadero.com/article/20165
Voisiko tuosta olla apua?
Juu kiitoksia.
Kun dll ladataan ajon aikana, ja se varaa dynaamisesti muistia palauttaen osoittimen käyttäjälle itse ohjelmaan, on hyvin suositeltavaa myös vapauttaa tämä muisti dll:n sisällä. DLL ja EXE saattavat käyttää nimittäin yksityisiä kekoja, joista dynaaminen muisti varataan. Näin ollen ohjelma kaatuu "heap corruption" -virheeseen, sillä EXE:llä ei ole lupaa kajota DLL:n kekoon.
Itse törmäsin tähän ongelmaan muutamia kuukausia sitten erästä projektiani tehdessä. Ongelma syntyy erityisesti silloin, kun projektit käännetään /MT(d) lipuilla. Näin ainakin M$:n kääntäjän kanssa...
Heap corruption tulee siitä, että dll:t ja exe käyttävät omia kopioitaan C:n ja C++:n ajonaikaisista kirjastoista. Jokaisessa kirjastokopiossa kun on omat muistinhallintaosionsa, jotka saa helposti ristiin, niin silloin kosahtaa.
Jos kerran dynaamisten kirjastojen kanssa askartelee - ja itse asiassa ihan aina muutenkin - niin eikös olisi aika luontevaa käyttää ajoympäristönkin kirjastoista dynaamisia versioita? Käännetään ja linkataan siis kaikki palikat - sekä dll:t että exe - samoilla kääntäjän vivuilla, siis sellaisilla, joissa on mukana /MD (= dynaamiset kirjastot). Silloin asiat menevät enimmäkseen juuri niin kuin pitääkin. Tuo /MT tarkoittaa staattista linkkausta eli itseaiheutettuja ongelmia.
Omassa tapauksessani projektin tuli olla "itsenäinen". Siksi jouduin käyttämään staattista linkitystä. Muutoin suosin kyllä dynaamista linkitystä. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.