Bir iletişim kutusunun içindeki düzenleme denetimine metin eklemeye çalışıyorum. Doğru eklemek için _tcscat_s alamıyorum. Çöküyor ve arabelleğin çok küçük veya boş sonlandırılmış bir dizeyle ilgili bir şey söylediğini söylüyor.Win32 - Bir Düzenle Denetimine metin ekleme
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);
}
:
– ShrimpCrackersNeden onu kullanıyorsunuz? Aynı algoritmayı kullanmak için, metni bir 'std :: string' içine yükleyin, ona ekleyin ve geri kaydedin. En azından C++ 11'de, verilerin bitişik olduğu garanti edilir. C++ 11 kullanmıyorsanız, std :: vector işlevi metni yüklemek için hemen hemen aynı şekilde çalışır. Alternatif olarak (ve muhtemelen daha iyi), [bu tekniği] kullanın (http://stackoverflow.com/a/12538062/962089). Bunun için hafıza yönetimi yok. Ekleme konusunda endişelenme. Sadece kullanımı kolay. – chris
@ShrimpCrackers: '_tcscat_s()' Eklenen metin arabelleğin sınırlarını aşarsa arabelleği büyütmez. '_tcscat_s()', arabellek boyutunu belirtmek için bir parametreye sahiptir, bu yüzden çok uzun olursa, birleştirilmiş metni keser. Bu nedenle, içine metin koymaya başlamadan önce arabelleği gereken son boyuta ayırmanız gerekir. –