Newsgroup: it.comp.programmare.win32
Titolo: Caricare testo da string-table (aiuto!)

Salve a tutti!
Dopo aver letto un po' di libri sul C++ e soprattutto quello del Petzold
sulle API di Windows, mi sono cimentato nell'impresa di scrivere un
programmino col Visual C++. Vi scrivo perché già da qualche settimana
non sono riuscito a risolvere una cosetta, da niente, da solo e prima di
arrendermi definitivamente mi rivolgo a voi! :) Vado al nocciolo della
questione: volendo realizzare un mini programmino con l'interfaccia
grafica che carica il testo dalle risorse tramite il Loadstring per i
menù, gli static e button dei dialog (tanto per fare un esempio) volevo
creare un'unica funzione contente il Loadstring anziché crearne uno per
ogni elemento (lo posso chiamare così?) dell'interfaccia grafica del
programma. Avevo pensato di creare un array di char* che carica il testo
dalla string-table contenuta nell'eseguibile ma il pezzo di codice pare
non funzionare! :( Lo posto qui di seguito:
[spezzone codice C++]
char* textResource[24];
static int arraynum;
static HINSTANCE hInstance;
szMainTitle[60];
for (int risorsa=14; risorsa <=36; risorsa++) {
LoadString(hInstance, risorsa, szStringa, 128) ;
textResource[arraynum] = szStringa;
counter++;
}
[fine spezzone codice C++]
Grazie per la vostra attenzione!!
P.S: La variabile textResource dovrebbe essere "condivisa" sia dal file
cpp contenente winmain sia da alcuni file cpp dotati di header. Si può
fare? 

 
Premesso che quello che vuoi fare non mi piace molto :) ...direi che 
comunque hai qualche problemino piu' con il C++ che con le API Win32...
infatti 
textResource[arraynum] = szStringa;
non va mica bene per banali stringhe "char *" ...se usi std::string puoi 
usare operator=, per i char * devi usare strcpy().
Inoltre, ti conviene usare i TCHAR (cosi' hai anche un supporto per 
Unicode nel tuo programma).
...Comunque, IMHO ti conviene prima possedere solidi basi di C++ (lascia 
perdere la GUI) e solo _dopo_ puoi buttarti nello sviluppo GUI.
Fai un po' tu... spero almeno che la dritta possa esserti utile.
Ciao
Danguard

 Danguard
;-) 

Un consiglio:
non usare Visual C++ come ambiente che di visuale non ha nulla!
Ti consiglio di usare C++ buider che di sicuro ti dimezza il tempo che perdi
nel creare le maschere. Così hai più tempo per litigare con le API ;-)
--------------------------------
Inviato via 
http://usenet.libero.it

 nel creare le maschere. Così hai più tempo per litigare con le API ;-)
:)
mah, a questo punto forse gli conviene usare direttamente Visual Basic, 
e poi impacchettare in apposite DLL i suoi giochetti con le API Win32 
SDK :) e poi richiama le DLL da VB.
Comunque, ci sono tante strade valide che possono essere percorse! :)
Bye
Danguard

 Cercherò di venirne a capo, altrimenti chissà se e quando lo finirò!
Di seguito ti invio un mio codice di una semplice funzione C/C++ per 
caricare una stringa da una risorsa string-table in una stringa C.
8<------------------------------8<-------------------------------8<
#include <windows.h>
#include <tchar.h>
///////////////////////////////////////////////////////////////////
// Nome: LoadStringFromResource()
// Scopo: Carica una stringa dalla string-table
// 
// Ritorna una stringa C in sola lettura, se tutto va bene.
// Altrimenti, in caso di errori, ritorna NULL.
///////////////////////////////////////////////////////////////////
const TCHAR * LoadStringFromResource(
    UINT stringID,	  // [IN] ID della stringa nella string-table
    HINSTANCE instance,// [IN] Istanza del modulo con la str.table
	)
{
    // Ampiezza del buffer per ospitare la stringa
    static const int BUFFER_SIZE = 256;
    // Buffer per ospitare la stringa
    static TCHAR buffer[BUFFER_SIZE];
    // Carica la stringa dalla string-table.
    // Se ritorna 0, si e' verificato un errore
    if (LoadString(instance, stringID, buffer, BUFFER_SIZE) == 0)
        return NULL; // errore
    // Ritorna la stringa caricata
    return buffer;
} // LoadStringFromResource()
///////////////////////////////////////////////////////////////////
8<------------------------------8<-------------------------------8<
Se vuoi usare le stringhe, comunque, ti consiglio di usare la classe C++ 
std::string (cosi' non perdi la testa con puntatori, deallocazione di 
memoria, ecc. ecc.)
Se vuoi caricare le stringhe aventi ID compresi tra firstID e lastID, 
puoi usare un codice C++ di questo tipo (che usa la funzione di sopra):
<CODE>
///////////////////////////////////////////////////////////////////
#include <windows.h>
#include <tchar.h>
#include <stdexcept>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
typedef vector<string> STRINGLIST;
// Le stringhe vanno qui dentro
STRINGLIST stringhe; 
// Assumo che
// HINSTANCE instance
// sia l'istanza del modulo con la string-table
// da cui vuoi caricare le stringhe
void CaricaStringhe(UINT firstID, UINT lastID)
{
    const TCHAR * strBuf = NULL;
    for (UINT id = firstID; id <= lastID; id++)
    {
        // Carica stringa da string-table
        strBuf = LoadStringFromResource(id, instance);
        if (strBuf == NULL)
            throw runtime_error("Errore caricamento stringhe");
 
        // Aggiungi la nuova stringa nel vettore
        stringhe.push_back( string(strBuf) );
    }
}
// Per vederti le varie stringhe caricate:
void StampaStringhe()
{
    const int N = (int)stringhe.size();
    for (int i = 0; i < N; i++)
        cout << "Stringa #" << (i+1) << ": " << stringhe[i] << endl;
}
///////////////////////////////////////////////////////////////////
</CODE>
Spero che ti possa essere utile... (non so se ci sono errori di 
battitura o simili... :) comunque l'idea piu' o meno e' li' nel codice 
:)
Ciao,
Danguard