2010-11-17 32 views
1

J'ai un exécutable de serveur COM hors processus qui a été développé à l'aide de Visual Studio 6.0 et fonctionne correctement depuis 10 ans . Maintenant, j'ai converti ce projet en Visual Studio 2010 et j'ai rencontré un problème avec GetInterfaceFromGlobal().L'appel GetInterfaceFromGlobal() échoue avec un serveur COM hors processus dans Visual Studio 2010

J'utilise le GIT pour contenir des pointeurs IDispatch à chacun de mes clients COM afin que je puisse leur envoyer des événements à partir du serveur COM hors processus. Après le débogage, la raison pour laquelle j'ai découvert est que le non. des connexions renvoyées par m_vec.Getsize() vient comme 4 au lieu de 1. Même si je n'ajoute qu'un seul client, la valeur arrive comme 4. J'ai vérifié ATLCOM.h et dans ce fichier _DEFAULT_VECTORLENGTH est passé de 1 à 4 dans le versions récentes.

#ifndef _DEFAULT_VECTORLENGTH 
#define _DEFAULT_VECTORLENGTH 4 
#endif 

Un conseil sur la façon dont je peux remplacer cette valeur? Dois-je simplement redéfinir ceci à 1 dans mon code? Cela aurait-il des effets secondaires? ou est-ce que je manque quelque chose?

Merci à l'avance Harish

+0

Pourquoi ne pas utiliser un vecteur STL? – Puppy

Répondre

1

Ne touchez pas cette constante - simplement ignorer le changement. _DEFAULT_VECTORLENGTH contrôle comment CComDynamicUnkArray::Add() fonctionne et votre code qui traverse l'objet CComDynamicUnkArray devrait simplement ignorer les pointeurs null stockés à l'intérieur.

Quelque chose comme ceci:

for(int i = 0; i < array.GetSize(); i++) { 
    IUnknown* pointer = array.GetAt(i); 
    if(pointer == 0) { 
     continue; 
    } 
    //proceed with the pointer 
} 

Si vous décidez de changer cette constante assurez-vous de créer un lien statique à ATL et assurez-vous de changer cette constante dans ATL et ainsi reconstruire ATL. Sinon, vous risquez de rencontrer un comportement indéfini pour des raisons described here

+0

Merci, en ignorant la solution des pointeurs NULL a fonctionné pour moi – Harish