Tentativo di aggiungere testo a un controllo di modifica all'interno di una finestra di dialogo. Non riesco a ottenere _tcscat_s da aggiungere correttamente. Si blocca e dice qualcosa sul buffer troppo piccolo o qualcosa su una stringa terminata da null.Win32 - Aggiunta di testo a un controllo di modifica
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
}
BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_INITDIALOG:
OpenAndReadFile(hwnd);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDSTART:
EndDialog(hwnd, IDSTART);
break;
case IDQUIT:
EndDialog(hwnd, IDQUIT);
break;
}
break;
case WM_CLOSE:
EndDialog(hwnd, 0);
break;
default:
return FALSE;
}
return TRUE;
}
BOOL OpenAndReadFile(const HWND &hwnd)
{
// Open the file
HANDLE hFile;
hFile = CreateFile(TEXT("sites.txt"), // file to open
GENERIC_READ, // open for reading
FILE_SHARE_READ, // share for reading
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE)
{
SetDlgItemText(hwnd, IDC_OUTPUT, TEXT("Error: File could not be opened\r\n"));
return FALSE;
}
else
SetDlgItemText(hwnd, IDC_OUTPUT, TEXT("sites.txt opened\r\n"));
AppendText(hwnd, TEXT("TEXT"));
// Read data from file
const DWORD BUFFERSIZE = GetFileSize(hFile, NULL);
char *ReadBuffer = new char [BUFFERSIZE]();
DWORD dwBytesRead = 0;
// read one character less than the buffer size to save room for the
// terminate NULL character.
//if (FALSE == ReadFile(hFile, ReadBuffer, BUFFERSIZE - 1, &dwBytesRead, NULL))
{
}
return TRUE;
}
void AppendText(const HWND &hwnd, TCHAR *newText)
{
// get size to determine buffer size
int outLength = GetWindowTextLength(GetDlgItem(hwnd, IDC_OUTPUT));
// create buffer to hold current text in edit control
TCHAR * buf = (TCHAR *) GlobalAlloc(GPTR, outLength + 1);
// get existing text from edit control and put into buffer
GetDlgItemText(hwnd, IDC_OUTPUT, buf, outLength + 1);
// append the newText to the buffer
_tcscat_s(buf, outLength + 1, newText);
// Set the text in the dialog
SetDlgItemText(hwnd, IDC_OUTPUT, buf);
}
ho presupposto che _tcscat_s sarebbe aggiungere lo spazio necessario quando si fa una concatenazione. È sbagliato? In tal caso, dovrei creare uno spazio aggiuntivo per il nuovo testo durante GlobalAlloc? – ShrimpCrackers
Perché usarlo a tutti? Per usare lo stesso algoritmo, basta caricare il testo in un 'std :: string', aggiungerlo e salvarlo di nuovo. Almeno in C++ 11, i dati sono garantiti come contigui. Se non si utilizza C++ 11, 'std :: vector' funziona quasi altrettanto bene per caricare il testo. In alternativa (e probabilmente meglio), usa [questa tecnica] (http://stackoverflow.com/a/12538062/962089). Nessuna memoria gestionale per questo. Non preoccuparti di aggiungere. Semplice da usare. – chris
@ShrimpCrackers: '_tcscat_s()' NON aumenta il buffer se il testo aggiunto supera i limiti del buffer. '_tcscat_s()' ha un parametro per specificare la dimensione del buffer in modo da troncare il testo concatenato se diventa troppo lungo. Di conseguenza, è necessario allocare il buffer alla dimensione finale richiesta prima di iniziare a inserire il testo. –