2010-01-09 6 views
2

Je dois envoyer une valeur VARIANT à une autre application en utilisant COPYDATASTRUCT. Voici la structure que j'utilise pour envoyer des messages.comment envoyer VARIANT_bstr sur COPYDATASTRUCT

struct { 
    int  i_MsgId; 
    VARIANT variant_Value; 
}Message; 

Dans mon code, j'initialise le VARIANT pour taper BSTR et allouer une chaîne comme suit. Puis je l'envoie en utilisant COPYDATASTRUCT comme suit.

COPYDATASTRUCT structCDS; 

structCDS.cbData = sizeof(structMessage); 
structCDS.dwData = 12; 
structCDS.lpData = (LPVOID)(&structMessage); 

::SendMessage(this->m_RemoteWindow,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&structCDS); 

Ce message reçoit avec succès à ma deuxième application, cependant, quand je l'ai jeté retour à la « bstrVal » struct original, indique un mauvais pointeur. Je suis aux prises avec cette erreur, alors j'attends votre aide précieuse. S'il vous plaît noter que d'autres types varinat (int, double) peuvent être convertis avec succès, et cette erreur ocus seulement avec bstr. :(

Merci Vous

Répondre

0

WM_COPYDATA partagera votre structure de données (celle référencée par lpData) avec l'autre application. Tout ce qui est contenu dans la structure de données sera accessible par l'autre application., BstrVal est cependant . un pointeur qui fait référence à la mémoire dans votre application, et quand l'autre application tente de référence, il va échouer

est ici une solution, il ne nécessite un travail supplémentaire sur les deux côtés

sur l'expéditeur. côté, lorsque vous allouez votre structure de données (structMessage), ajoutez suffisamment d'espace pour yo ur chaîne. Ajoutez la chaîne à la fin de la structure de données (et veillez à augmenter dwData de la taille appropriée). Du côté du récepteur, vous pouvez récupérer la chaîne et utiliser l'appel SysAllocString à ce point pour affecter le bstrVal. N'oubliez pas d'appeler SysFree lorsque vous avez terminé.