Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [C++] Luokan lataus DLL:stä

Jalmari91 [11.03.2009 21:47:44]

#

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.

kayttaja-3842 [12.03.2009 09:24:09]

#

Ensimmäinen google sivu kertooo....

http://edn.embarcadero.com/article/20165

Voisiko tuosta olla apua?

Jalmari91 [12.03.2009 16:37:30]

#

Juu kiitoksia.

Mazzimo [12.03.2009 20:54:05]

#

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...

koo [12.03.2009 23:12:36]

#

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.

Mazzimo [15.03.2009 17:27:05]

#

Omassa tapauksessani projektin tuli olla "itsenäinen". Siksi jouduin käyttämään staattista linkitystä. Muutoin suosin kyllä dynaamista linkitystä. :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta