2010-07-13 15 views
0

Il semble que j'ai trouvé la plupart de mes problèmes simplement en multi-thread mon application! Cependant, je suis confronté à une petite erreur: "Stack around variable 'x' était corrompu." Cela fonctionne correctement (après avoir quitté abort sur l'erreur de débogage), mais évidemment je ne peux pas avoir une erreur chaque fois que quelqu'un exécute l'application. Donc, voici le code pertinent. C'est le rappel d'un de mes threads de travail.WinAPI Ecrire "Edit" Dialog to Pipe (Erreur: empiler autour de la variable 'x' a été corrompu)

DWORD WINAPI Arc_writePipe(LPVOID threadParam) 
{ 
    Arc_Redirect ar; 
    DWORD dwWrote; 
    CHAR chBuf[BUFSIZE]; 
    HANDLE hPipe = (HANDLE)threadParam; 
    HWND g1 = FindWindow("GUI",NULL); 
    HWND dlg = GetDlgItem(g1,IDO_WORLDOUT); 
    //int nLength = GetWindowTextLength(GetDlgItem(g1,IDO_WORLDINPUT)); 

    while(bRunThread) 
    { 
     if(GetDlgItemText(g1,IDO_WORLDINPUT,chBuf,BUFSIZE)) 
     { 
      chBuf[BUFSIZE] = '\0'; 
      if(!WriteFile(hPipe,chBuf,BUFSIZE,&dwWrote,NULL)) 
      { 
       //SetDlgItemText(g1,IDO_WORLDINPUT,NULL); // This is to reset text when done sending to input 
       if(GetLastError() == ERROR_NO_DATA) 
        break; // Normal :) 
       else 
        MessageBox(g1,"Error: Could not WriteFile();","Error",MB_ICONERROR); 
      } 
     } 
    } 
    return 1; 
} 

Quelqu'un a-t-il une idée de la raison pour laquelle cette erreur persiste? Je ne reçois aucune sortie GetLastError() autre que "ERROR_NO_DATA" après l'écriture des données, donc je suppose que cela a quelque chose à voir avec mon WriteFile(); fonctionne en conjonction avec le BUFSIZE (défini à 0x1000). Donc, fondamentalement, je fais quelque chose de mal. Est-ce que quelqu'un sait peut-être un meilleur moyen d'obtenir des informations à partir d'une boîte de dialogue d'édition et de l'écrire sur un tuyau?

Merci beaucoup pour votre aide!

Cordialement,
Dennis M.

+0

Je ne vois aucune variable 'x' dans votre code. Quelle est la variable réelle qui est corrompue? –

Répondre

2

Je ne sais pas où la corruption se passe, donc je ne sais pas exactement ce que le problème est. Cependant, la ligne suivante est erroné:

chBuf[BUFSIZE] = '\0'; 

Vous avez déclaré chBuf avec la taille BUFSIZE ce qui signifie que l'indice BUFSIZE est en fait en dehors du tableau. Cela entraînera une corruption de la pile. Ce que vous devez vraiment faire est chBuf[BUFSIZE - 1] = '\0';

2

En plus d'indexer le tableau au-delà de la fin comme JS Bangs l'a souligné, vous ne voulez probablement pas écrire le chBuf entier dans le tube, comme vous écrivez actuellement le terminateur null ainsi que les déchets qui remplissent le reste du tableau après la fin de la chaîne. Vous voudrez peut-être vérifier la longueur de la chaîne que vous avez récupérée et n'écrivez que ce montant.