2010-10-01 4 views
3

J'ai surchargé global new/delete (et new []/delete []) pour remplir et vérifier les blocs protégés. Fonctionne bien. Maintenant, je lie aux DLL C++ en passant des instances de conteneur STL qui sont remplies ou modifiées par les DLL. Lors de la destruction de ces conteneurs, je rencontre une erreur, car ils ne sont pas alloués en utilisant mon nouvel opérateur surchargé et vice versa, les dll génèrent des erreurs lors de la libération des éléments de conteneur qui ont été créés en utilisant mon nouveau surcharge.Comment faire une DLL C++ appeler mon nouvel opérateur global surchargé?

Comment faire pour que les DLL appellent mon nouvel opérateur? Pour certaines DLL j'ai les sources, pour d'autres je ne l'ai pas.

Il doit y avoir une approche globale en tant que les DLL Visual Studio Runtime MSVCP * .DLL appeler mes opérateurs surchargés. Comment puis-je faire d'autres DLL appeler mes opérateurs aussi? A) Avec les sources pour la DLL? et vérifiez b) Sans les sources de la DLL?

+0

vos fichiers ex et dll utilisent-ils le même runtime? – Chubsdad

+0

Jusqu'à présent: oui, tous utilisent la même chose. –

Répondre

0

Je pense que vous devez placer le nouveau code/supprimer dans une DLL et assurez-vous que l'exe et vos DLL supplémentaires appellent ce code commun.

Même cette approche a des problèmes, donc pour moi, il est préférable de s'assurer que le module qui a alloué un morceau de mémoire est le même module qui le supprime mais ce n'est pas une simple exigence.

2

pour dll vous pouvez compiler, vous pouvez les obtenir pour appeler votre code appelant les méthodes surchargées par

  1. en vous assurant comprend l'en-tête définissant vos surcharges
  2. exporter ces surcharges de votre dll en les spécifiant dans un fichier d'exportation

Voici les exportations (en utilisant des noms mutilés, jamais trouvé une autre façon de le faire) pour les versions de lancement new/delete/new []/delete [].

x86:

EXPORTS 
    [email protected]@Z 
    [email protected]@Z 
    [email protected]@Z 
    [email protected]@Z 

x64:

EXPORTS 
    [email protected][email protected] 
    [email protected]@Z 
    [email protected][email protected] 
    [email protected]@Z 

Je ne pense pas que cela fonctionne pour dll que vous n'êtes pas vous-même si la compilation (au moment où ils ont été construits l'éditeur de liens a déjà pris soin de trouver les références aux méthodes); Pour ce faire, vous devrez peut-être utiliser des trucs plutôt sales comme accrocher le crt pour votre processus. Pour l'inverse, vous pouvez passer des allocateurs de l'application hôte dans la DLL et vous assurer que la DLL utilise uniquement ces allocateurs à allouer, au lieu de new/delete. Havee thos alloacteurs appelez votre nouveau/supprimer surchargé à son tour. C'est un peu brouillon mais devrait fonctionner, aussi avec STL puisque vous pouvez spécifier l'allocateur pour ces conteneurs; mais encore une fois, cela ne résout rien si vous voulez un DLL pour lequel vous n'avez pas le code à allouer en utilisant votre code de contrôle des limites.

+0

Je pense que ce n'est pas exactement, ce que je vais faire: je veux appeler le code dans l'application à partir de la DLL. L'exportation fait l'inverse, mais cela pose des problèmes différents. Je vais avoir les opérateurs surchargés dans la DLL. Est-il généralement possible d'appeler du code dans l'hôte à partir de la Dll sans devoir appeler des fonctions pour l'enregistrer, etc.? –

+0

désolé mais je ne comprends pas ce que vous voulez dire exactement .. pouvez-vous fournir un exemple de code peut-être? pouvez-vous également reformuler 'Je veux appeler du code': voulez-vous dire 'programme principal veut appeler des fonctions'? ou préférez-vous quelque chose comme 'dll wnats pour accéder aux données (objets) alloués dans le programme principal'? – stijn

+0

La DLL doit avoir des 'Importations' qui résolvent le code dans l'application hôte. La DLL doit donc appeler des fonctions dans l'application hôte. Cela n'appartient pas seulement aux opérateurs, etc. Je ne sais pas si c'est possible. Ne semble pas. –

Questions connexes