spero che fin qui sia corretto.
Al di là del fatto che, come ti è già stato detto, LPTSTR (compilando come non Unicode) è uguale a char * (per cui non c'è bisogno di convertire niente), quel codice è sbagliato dall'inizio alla fine. Prima di chiamare una funzione leggi sulla MSDN cosa le devi passare, non passarle dati a caso!
The GetWindowText function copies the text of the specified window's title bar (if it has one)
into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application.
Già il testo evidenziato ti dovrebbe mettere in allarme: tu le hai passato nessun buffer, tu le hai passato un puntatore a char non inizializzato! Quindi, prima correzione:
codice:
char str[256]; //era: LPTSTR str;
.
Leggiamo le descrizioni dei parametri:
codice:
int GetWindowText(HWND hWnd,
LPTSTR lpString,
int nMaxCount
);
hWnd
[in] Handle to the window or control containing the text.
lpString
[out] Pointer to the buffer that will receive the text. If the string is as long or longer than the buffer, the string is truncated and terminated with a NULL character.
nMaxCount
[in] Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated.
Ora, il secondo parametro l'abbiamo già sistemato; passiamo agli altri. In primo luogo parliamo di nMaxCount: ti pare che nella documentazione dica che specifica l'ID del controllo di cui recuperare il testo? A me no... piuttosto, dovrai passargli le dimensioni del tuo buffer, per evitare buffer overflow, quindi devi passare sizeof(str). Quanto all'ID del controllo, in questa funzione non è previsto, visto che si tratta di una funzione che opera genericamente con le finestre. Dovrai quindi ottenere un handle al controllo usando la GetDlgItem (ti rimando alla MSDN per informazioni su questa funzione):
codice:
char str[256];
GetWindowText(GetDlgItem(hwndDlg, EOPEN), str, sizeof(str));
.
Se guardiamo alla sezione "Return value" della documentazione leggiamo quanto segue:
If the function succeeds, the return value is the length, in characters, of the copied string, not including the terminating NULL character.
If the window has no title bar or text, if the title bar is empty, or if the window or control handle is invalid, the return value is zero. To get extended error information, call GetLastError.
; quindi, ad ogni buon conto, potremmo aggiungere un controllo per verificare se l'operazione è andata a buon fine:
codice:
char str[256];
if(!GetWindowText(GetDlgItem(hwndDlg, EOPEN), str, sizeof(str)))
MessageBox(hwndDlg, "Impossibile recuperare il testo della finestra.", "Errore", MB_ICONERROR);
. D'altra parte nella maggior parte dei casi gestire anche questi errori così improbabili è fin paranoico: se non funziona una GetWindowText vuol dire che ci sono problemi ben più gravi.
In ogni caso lavorando con i dialog c'è un modo più comodo per recuperare il testo di un controllo, ossia la GetDlgItemText, che funziona praticamente come la GetWindowText:
codice:
char str[256];
if(!GetDlgItemText(hwnDlg, EOPEN, str, sizeof(str)))
MessageBox(hwndDlg, "Impossibile recuperare il testo della finestra.", "Errore", MB_ICONERROR);
.
Comunque, ribadisco: prima di scrivere codice a caso, leggi la documentazione.