Domanda

Qual è il modo corretto di importare una classe C ++ da una DLL? Stiamo usando Visual C ++.

C'è il dllexport / exports.def + LoadLibrary + GetProcAddress trifecta, ma non funziona con le classi C ++, ma solo con le funzioni C. Ciò è dovuto alla modifica del nome in C ++? Come faccio a farlo funzionare?

È stato utile?

Soluzione 2

Trovato la soluzione su http://www.codeproject.com/KB/DLL/ XDllPt4.aspx

Grazie per i vostri sforzi ragazzi & amp; ragazze

Altri suggerimenti

Devi aggiungere quanto segue:

extern "C"
{
...
}

per evitare la distruzione delle funzioni.

potresti considerare di scrivere due semplici funzioni C:

SomeClass* CreateObjectInstace()
{
    return new SomeClass();
}

void ReleaseObject(SomeClass* someClass)
{
   delete someClass;
}

Usando solo quelle funzioni puoi successivamente aggiungere / modificare la funzionalità di creazione / cancellazione dell'oggetto. Questo a volte viene chiamato Factory.

Dichiaro normalmente una classe base di interfaccia, utilizzo questa dichiarazione nella mia applicazione, quindi uso LoadLibrary, GetProcAddress per ottenere la funzione di fabbrica. Il fattore restituisce sempre il puntatore del tipo di interfaccia.

Ecco un esempio pratico, esportazione di un documento MFC / vista da una DLL , caricato dinamicamente

Dai un'occhiata a questa domanda . Fondamentalmente, ci sono due modi. È possibile contrassegnare la classe utilizzando _dllexport e quindi collegarsi alla libreria di importazione e la DLL verrà caricata automaticamente. Oppure, se si desidera caricare la DLL in modo dinamico, è possibile utilizzare l'idea della funzione di fabbrica suggerita da @titanae

dllexport / dllimport funziona, posizionalo prima del nome della classe nel file di intestazione e sei a posto.

In genere vuoi usare dllexport nella dll e dllimport nell'exe (ma puoi semplicemente usare dllexport ovunque e funziona, farlo 'giusto' rende il caricamento più veloce).

Ovviamente è per la compilazione del tempo di collegamento. Puoi usare / ritardare la direttiva linker per renderla "dinamica", ma probabilmente non è quello che vuoi dalla riga dell'oggetto.

Se vuoi davvero un caricamento in stile LoadLibrary, dovrai avvolgere le tue funzioni C ++ con " C esterno " involucri. Il problema è a causa della modifica del nome, è possibile digitare il nome completamente alterato e funzionerebbe.

Le soluzioni alternative sono generalmente di fornire una funzione C che restituisce un puntatore alla classe corretta - COM funziona in questo modo, poiché esporta 4 funzioni C da una dll che vengono utilizzate per ottenere i metodi di interfaccia all'interno dell'oggetto nella dll.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top