J'essaie d'obtenir une communication inter-processus via des messages WM_COPYDATA. Le membre lpData de COPYDATASTRUCT ne peut pas contenir de pointeurs. Mon problème est, quelle est la différence entre les tableaux char et d'autres tableaux ou vecteurs. Lorsque j'utilise un tableau char comme ici, il envoie des messages avec succès. Mais quand j'utilise un vecteur, l'application réceptrice ne peut pas l'obtenir.WM_COPYDATA avec tableau vs vecteur
typedef struct tagOTHERSTRUCT {
wchar_t one[40] = { 0 };
wchar_t two[20] = { 0 };
wchar_t three[20] = { 0 };
wchar_t four[4] = { 0 };
wchar_t five[3] = { 0 };
} OTHERSTRUCT, *POTHERSTRUCT;
typedef struct tagMYSTRUCT2 {
std::vector<OTHERSTRUCT> y;
} MYSTRUCT2, *PMYSTRUCT2;
J'ai un vecteur global externe 'gOtherStructList'. Dans les différentes parties du programme, cette variable globale est remplie. Par exemple,
DWORD WINAPI foo(LPCTSTR lpchText) {
...
if (sizeof(lpchText[0]) == 2) {
wcscpy(gOtherStructList[0].one, lpchText);
}
...
}
Puis, quand je vous envoie cette liste globale, je suis le copier dans la variable de MYSTRUCT2 (pour des raisons non liées) avec wcscpy() pour chaque wchar_t de chaque élément.
Voilà comment j'envoie au récepteur de l'application:
MYSTRUCT2 my_struct; //my_struct.y is a vector
// Filled my_struct.y here with wcscpy()
COPYDATASTRUCT cds;
cds.dwData = MY_CASE;
cds.cbData = sizeof(OTHERSTRUCT) * my_struct.y.size();
cds.lpData = &my_struct;
SendMessage(gDataReceiver, WM_COPYDATA, NULL, (LPARAM)&cds);
Si elle fait la différence, l'application utilise la réception de ces messages comme:
case WM_COPYDATA:
{
PCOPYDATASTRUCT pcopydata = (PCOPYDATASTRUCT)lParam;
switch (pcopydata->dwData) {
case MY_CASE:
// When I code this, it works
PMYSTRUCT p = (PMYSTRUCT)(pcopydata->lpData);
wcscpy(mylocalvar, p->x); // for char array
...
// But, this doesn't work.
std::cout << "New message received" << std::endl; // this gets printed, then program crashes.
PMYSTRUCT2 p = (PMYSTRUCT2)(pcopydata->lpData);
OTHERSTRUCT mylocallist[100],
wcscpy(mylocallist[0].one, p->y[0].one);
}
Je comprends pourquoi nous ne pouvons pas utiliser des pointeurs pour WM_COPYDATA . Ce que je ne comprends pas, c'est quelle est la différence de ces exemples. Pourquoi pouvons-nous utiliser des tableaux char, mais pas des vecteurs?
Modifier:Édité ma question, basée sur des commentaires informatifs.
Merci
[WM_COPYDATA] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms649011.aspx) peuvent rassembler un seul bloc de mémoire à travers boun de processus daries. Si vous devez communiquer des données structurées, vous devez les sérialiser et les désérialiser dans le processus de réception. Je suppose que 'OTHERSTRUCT' contient des pointeurs, directement ou indirectement. Les pointeurs ne sont valides que dans le processus d'où ils proviennent. – IInspectable
OTHERSTRUCT possède 5 tableaux wchar_t. Rien de plus. Mais quand j'essaie de les copier, cela donne une erreur contrairement au premier exemple. – ilkerpyci
Vous devez afficher la déclaration de 'OTHERSTRUCT' –