Tecnicamente non dovresti avere problemi, ma il come sempre questo metodo è piuttosto rischioso (ci si può facilmente dimenticare di deallocare la memoria); dato che stai lavorando in C++, perché non usi la classe string della STL? Ti eviteresti tutto questo genere di problemi:
file1.cpp
codice:
std::string testo;    //variabile globale
file2.cpp
codice:
  extern std::string testo;
  ...
  ...

  WM_COMMAND:
    testo=GetValue(hwnd,idctrl);
file3.cpp
codice:
  extern std::string testo;
  ...
  ...
  
  WM_INITDIALOG:
     //operazioni con testo
     ...
     ...
     //non c'è bisogno di liberare niente
file4.cpp
codice:
...
...
 
std::string GetValue(HWND hwnd, int IDCtrl) {
   char* bufTxt=NULL;
   std::string ret;
   int lStr=GetWindowTextLength(GetDlgItem(hwnd,IDCtrl));
   if (lStr>0) {
	bufTxt = (char*)GlobalAlloc(GPTR,lStr+1);
	GetDlgItemText(hwnd,IDCtrl,bufTxt,lStr+1);
        ret=bufText;
        GlobalFree(bufTxt);
   }
   return ret;
}
Un paio di appunti:
  • usa Unicode (imposta il progetto per l'uso di Unicode e non usare char ma wchar_t, non string ma wstring);
  • per il passaggio di dati al momento della creazione di un dialog non usare variabili globali, ma sfrutta piuttosto la funzione DialogBoxParam.