2008-12-03 7 views

Répondre

2

Hm ... Cette question était un peu difficile à comprendre, j'en ai peur.

En C++, une déclaration struct est juste une déclaration. Il ne génère pas quelque chose que vous pouvez charger lors de l'exécution, c'est une pure construction à la compilation qui indique au compilateur comment quelque chose est mis en mémoire, les champs impliqués, leurs types et leur ordre, etc.

1

Je suppose que vous utilisez VC 2005.

MS maintenant vous offrir Delay Loading Dll's.

Le lieur Visual C++ prend désormais en charge le chargement différé des DLL. Cette vous soulage de la nécessité d'utiliser les fonctions Windows SDK LoadLibrary et GetProcAddress pour implémenter le chargement retardé DLL. Étapes à suivre pour configurer la charge différée.

Aller projet-> Propriétés-> Linker-> Entrée puis spécifiez votre dll dans « » retard DLL Loaded

+0

S'il veut charger des bibliothèques dynamiquement en fonction du versionnement et de la disponibilité, LoadLibrary doit toujours être utilisé. –

+0

Merci pour cela. Je ne savais pas celui-ci. – mahesh

3

Voulez-vous dire pour mettre les données dans une dll et utiliser LoadLibrary et Getprocaddres pour obtenir un pointeur aux données? Cela est possible, bien qu'il soit plus fréquent de placer des fonctions dans une DLL et de les laisser retourner un pointeur sur les données.

8

Permettez-moi de supposer certaines choses qui sont laissés dans la question:

  1. Vous avez une bibliothèque dynamique appelée flubber.dll
  2. La bibliothèque exporte la fonction bool GetFlubber(Flubber* flubber).
  3. La fonction et le type Flubber (qui se trouve être un struct!) Sont déclarés dans un fichier d'en-tête appelé flubber.h.

Si ces 3 conditions sont remplies, vous pouvez utiliser LoadLibrary sur flubber.dll, suivi par GetProcAddress avec GetFlubber comme nom de proc, et enfin vous pouvez déclarer une instance Flubber localement et le transmettre à GetFlubber via le adresse proc récupérée.

0

Comme d'autres réponses ont suggéré qu'il est difficile de dire ce qui est demandé ici, mais je vais donner une réponse pour une autre interprétation de la question. Je ne suis pas sûr si c'est "officiellement supporté", mais vous pouvez avoir une DLL exporter une variable globale, puis y accéder dynamiquement via GetProcAddress. Par exemple, si une bibliothèque appelée foo.dll contient un global de type FOO nommé g_MyGlobal, alors elle peut exporter la variable dans foo.def. Le code client peut alors appeler:

MyPointer = GetProcAddress(..., "g_MyGlobal"); 

et d'obtenir un pointeur "FOO *" sur le global.

...mais avec cela dit, si vous avez besoin de faire cela pour autre chose que des tests privés, vous pourriez vouloir repenser votre conception. Il serait probablement beaucoup plus sûr et plus propre de cacher ce global derrière une fonction exportée dans la DLL.

Questions connexes