Win32 - Anfügen von text in ein Edit-Steuerelement
Versucht, anfügen von text an ein edit-Steuerelement in einem Dialogfeld. Ich kann nicht _tcscat_s Anhängen richtig. Es stürzt ab und sagt etwas über die Puffer zu klein oder etwas über eine mit null beendete Zeichenfolge.
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 );
}
- Ich habe vorausgesetzt, dass _tcscat_s möchte hinzufügen, den Speicherplatz notwendig, wenn eine Verkettung. Ist das falsch? Wenn dem so ist, würde ich brauchen, um zusätzlichen Platz für die NeuerText während GlobalAlloc?
- Warum verwenden Sie es überhaupt? Zu den gleichen Algorithmus verwenden, laden Sie einfach den text in ein
std::string
, fügen Sie es, und speichern Sie Sie zurück. In C++11 ist zumindest der Daten gewährleistet ist zusammenhängend sein. Wenn nicht mit C++11,std::vector
funktioniert fast genauso gut laden Sie die text. Alternativ (und vermutlich besser), die Technik. Keine Verwaltung des Speichers für Sie. Keine sorgen über anfügen. Genauso einfach zu verwenden. _tcscat_s()
Wächst NICHT die Puffer, wenn der text angehängt wurden, überschreitet die Grenzen des Puffers._tcscat_s()
hat einen parameter geben Sie die Größe des Puffers, so wird es abgeschnitten den verketteten text wird zu lang. Als solche müssen Sie eine Zuordnung der Puffer auf die gewünschte Endgröße, bevor Sie beginnen, text in es.- mögliche Duplikate von Wie man anfügen von text an ein Textfeld?
Du musst angemeldet sein, um einen Kommentar abzugeben.
GetWindowTextLength()
gibt die Anzahl derTCHAR
Elemente im text, aberGlobalAlloc()
erwartet ein byte-Zählung statt. Wenn Sie kompilieren für UnicodeTCHAR
ist 2 byte, nicht 1 byte, aber Sie nehmen nicht in Konto. Sie sind auch nicht die Zuweisung der Puffer groß genug für den vorhandenen text und der neue text angehängt wird. Sie sind auch undicht, der Speicher, die Sie zuordnen.Versuchen Sie dies:
Alternativ:
Mit dieser sagte, immer das Fenster im aktuellen text in den Speicher, Anhängen, und dann wieder das Fenster text ist ein sehr ineffizienter Weg, um Anhängen von text an ein edit-Steuerelement. Verwenden Sie die
EM_REPLACESEL
Nachricht statt:EM_...
Nachrichten gehen auf das edit-Steuerelement direkt, so es Sinn macht, greifen Sie seine HWND einmal und verwenden Sie es mehrmals. Die DlgProc() HWND des übergeordneten dialog. 2)reinterpret_cast
ist C++'s geben-sicher, compile-Zeit-validiert Weg zu geben warf einen Zeiger auf eine ganze Zahl und Umgekehrt (unter anderem). 3) Lesen Sie die Dokumentation. 4) Sie haben einen Speicherverlust inOpenAndReadFile()
.http://support.microsoft.com/kb/109550
Ist Ihre Antwort: