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?
Schreibe einen Kommentar