Comment utiliser une classe dans la DLL?
Puis-je mettre une classe à l'intérieur d'une DLL?
La classe, j'ai écrit est: est-ce
class SDLConsole
{
public:
SDLConsole();
~SDLConsole(){};
void getInfo(int,int);
void initConsole(char*, char*, SDL_Surface*, int, int, int);
void sendMsg(char*,int, SDL_Surface*);
void cls(SDL_Surface*);
private:
TTF_Font *font;
SDL_Surface *consoleImg;
int width, pos, height, line, size, ctLine;
SDL_Surface* render(char*,int);
};
Je sais comment charger une DLL et l'utilisation de la fonction dans une DLL, mais comment puis-je mettre une classe à l'intérieur d'une DLL? Je vous remercie beaucoup.
- Je crois tout ce que vous avez besoin est ici
- Avez-vous essayé?
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez de l'exécution de liaison dynamique (utilise la fonction LoadLibrary pour charger la dll) vous ne pouvez pas accéder à la classe directement, vous devez déclarer une interface pour votre classe et de créer une fonction qui retourne une instance de cette classe, comme ceci:
Sinon, si vous avez le lien de la dll au cours du temps de chargement, il suffit d'utiliser les informations fournies par icecrime: http://msdn.microsoft.com/en-us/library/a90k134d.aspx
__declspec(dllexport)
. Même au moment du chargement de réticulation devrait utiliser cette méthode.__declspec(dllexport)
tout doit correspondre: fournisseur de compilateur, compilateur de la version, des options de compilation, ou soit vous finissez avec le nom modificateur de décalage (erreur de lien) ou d'une définition de la violation des règles et correspondant se bloque.DllGetClassObject
, et vous ne jamais recevoir des pointeurs d'interface.Solution suggéré par bcsanches,
Si vous allez utiliser cette approche comme suggéré par bcsanches, alors assurez-vous que vous utilisez la fonction suivante pour
delete
votre objet,De définir ces fonctions toujours de la paire, comme il assure que vous supprimez vos objets à partir de la même segment de mémoire/mémoire-piscine/etc ils ont été créés. Voir ce paire-fonctions
IUnknown
et suivez les COM protocole), de sorte que vous pouvez utiliser COM interop sur le .NET. Deuxièmement, l'exportation d'une usine de la fonction à partir de votre fichier DLL qui renvoie une instance de votre classe, comme il est suggéré dans bcsanches de réponse, ce qui permet ensuite[DllImport]
à partir de votre .NET code.Vous le pouvez, et toutes les informations dont vous avez besoin sont sur cette page et cette page :
Tout ce qu'il ya à faire est de définir le symbole de préprocesseur
_EXPORTING
lors de la construction de la DLL.Si vous souhaitez exposer les données dans une classe, les solutions ci-dessus ne sera pas coupé. Vous avez de gifler un
__declspec(dllexport)
sur la classe elle-même dans la DLL de la compilation, et une__declspec(dllimport)
dans le module que des liens vers les DLL.Une technique courante est de le faire (Microsoft assistants de produire un code comme ceci):
Alors assurez-vous
EXPORT_API
est définie dans le projet de DLL, et assurez-vous qu'il n'est pas défini dans le module liens à la DLL.Si vous créez un nouveau projet DLL de Visual C++ à partir de zéro, et cochez la case "Exporter des symboles", un exemple de code sera généré à l'aide de cette technique.