2010-11-16 25 views
1

Bonjour tout,partage un objet entre les instances d'une DLL C++

Pardonnez-moi si le titre est pas trop clair, je vais essayer d'expliquer plus ici:

Je travaille actuellement avec l'ASI pour VBS2. VBS2 exécute des fonctions à partir d'un plugin DLL VBS2. J'ai ma propre application que je veux utiliser pour modifier les variables dans ce plugin pendant qu'il est utilisé, pour changer ce qui est en cours d'exécution par VBS2. J'ai commencé par, aussi stupide soit-il, en changeant directement les variables avec mon application pendant que le programme VBS2 fonctionnait. Lorsque cela n'a pas fonctionné, j'ai testé et constaté que le programme VBS2 utilisait une instance différente de l'objet "message", dans lequel je stockais la variable, à celui auquel accède mon application.

Ce que je voudrais faire est que mon application accède à la même instance de l'objet accédé par VBS2. J'ai expérimenté un peu avec

#pragma data_seg(".testseg") 
Message msg; 
void foo(...); //etc. 
#pragma data_seg() 

mais pour une raison ou une autre, il semble toujours que deux instances soient utilisées.

J'apprécierais beaucoup toute l'aide, et ajouterais que C++ est une nouvelle langue pour moi alors s'il vous plaît soyez doux. :)

Merci, M

+0

Pensez-vous que le _function_ 'foo()' se termine dans le segment _data_ '.testseg'? Cela peut causer des conflits avec DEP. – MSalters

Répondre

1

Vous devez utiliser des indicateurs de liens pour indiquer au lieur de placer ce segment dans la mémoire partageable.

Voir http://msdn.microsoft.com/en-us/library/ms933104.aspx

Je vous belive besoin d'ajouter quelque chose comme

#pragma comment(linker, "/SECTION:.testseg,RWS") 

à votre programme. Je ne suis pas sûr, cela peut ne fonctionner que dans une DLL ...

+1

C'est une très bonne approche. – user434507

+1

Oh, et vous devrez peut-être déclarer vos variables volatiles pour vous assurer que le compilateur les lit réellement et ne cache pas les valeurs dans les registres, etc. – jcoder

+0

Cela fonctionnerait n'importe où, les fichiers EXE aussi. Cependant, dans ce cas, le seul module partagé entre le processus "VBS2" et l'autre processus est la DLL du plugin que les deux chargent. – MSalters

0

Si je comprends bien ce que vous voulez, vous ne pouvez pas le faire avec des outils standard C/C++. Votre programme et l'autre programme vivent dans des espaces mémoire séparés et sont complètement isolés les uns des autres. Si votre programme a des privilèges d'administrateur, vous pouvez essayer de lire & écrire l'espace mémoire de l'autre processus en utilisant WriteProcessMemory():

http://msdn.microsoft.com/en-us/library/ms681674%28v=VS.85%29.aspx

Mais il y a un problème de trouver le bon objet dans cet espace mémoire.

Il n'est pas clair si vous avez la source pour le plugin. Si vous le faites, il existe d'autres techniques de communication interprocessus qui peuvent être utilisées. Rien n'est aussi simple que de simplement changer la variable, malheureusement.

+0

J'ai la source, oui. Je pensais juste, serait ce travail si j'avais mon application modifiant une variable dans une autre DLL, et avoir la DLL VBS2 accéder à cette variable à la place? Ou cela créerait-il le même problème qu'avant? Je peux aller à ce sujet complètement dans le mauvais sens; le plugin VBS2 ASI envoie des messages à VBS2 pour exécuter divers scripts dans le moteur. Tout ce que je veux faire est de changer de façon dynamique les messages qui sont envoyés, ce que je sais que je peux faire. Merci beaucoup pour votre réponse, aussi. – Myn