Newsgroup: it.comp.programmare.win32
Titolo: Includere file di testo come risorsa

Ciao a tutti,
devo realizzare un programma semplice che legga da file di testo e
visualizzi in un controllo rtf. Usando l'approccio normale con i file
nessun problema, soltanto che i file in questione devono essere
"esterni", in pratica quando l'utilizzatore si troverà in mano il
file .exe avrà anche tutta ua serie di file .txt a corredo e questo lo
vorrei evitare.
Le mie domande sono:
- come faccio a includere un file .txt nel mio progetto? Per ora l'ho
fatto aggiungendo manualmente al file .rc i dati dei miei file di
testo, non so però come provarlo perchè non so
- come fare, una volta avuta la risorsa interna (ad esempio
IDD_FILETEXT1 di tipo TEXT) a leggerci dentro?
credo che per la seconda serva un FindResource ma non ho la minima
idea di come usarlo.
Ciao e grazie fin d'ora
Alberto

Aggiungo inoltre che sto realizzando un'applicazione MFC e il codice
con cui cerco di leggere la risorsa di testo è il seguente:
	CString sFile;
	HRSRC hRscr;
	HGLOBAL hGlobal;
	hRscr = FindResource(NULL, MAKEINTRESOURCE(IDR_TEXTFILE1),
"RT_STRING");
	if(hRscr)
	{
		hGlobal = LoadResource(NULL, hRscr);
		if(hGlobal)
		{
			sFile = (char*)LockResource(hGlobal);
			DeleteObject((HGDIOBJ)hGlobal);
		}
	}
non so se sia corretto, il discorso è comunque che il FindResource mi
torna a 0

"RT_STRING");
Con RT_STRING cerchi la risorsa nella String Table e non nella tua
TEXT.
Ti posto un esempio funzionante:
{
char *p,*Buf;
DWORD Len;
// Risorsa di tipo TESTO con id IDR_TESTO
HRSRC hRC = FindResource (NULL,MAKEINTRESOURCE (IDR_TESTO),"TESTO");
if (hRC == NULL)
	{
	MessageBox (NULL,"FindResource","",MB_OK);
	return FALSE;
	}
HGLOBAL hTxt = LoadResource (NULL,hRC);
if (hTxt == NULL)
	{
	MessageBox (NULL,"LoadResource","",MB_OK);
	return FALSE;
	}
p = (char *) LockResource (hTxt);
Len = SizeofResource (NULL,hRC);
Buf = new char [Len+1];
memcpy (Buf,p,Len);
Buf [Len] = '\0';
// Visualizza
MessageBox (NULL,Buf,"",MB_OK);
}

Ciao Goodidea e grazie per la pronta risposta, credo di sbagliare
ancora qualcosa perchè il mio file di testo ha tre righe:
APippo
Pluto
Paperino
alla fine delle istruzioni che mi hai postato trovo in Buf  " ÿþA "
mentre io avrei bisogno di trovarmi il contenuto del file, c'è
qualcosa che sbaglio?
ciao e grazie ancora
Albe

 testo, non so però come provarlo perchè non so
#ifndef __testoCheTiInteressaP__
#define __testoCheTiInteressaP__
static char* testoCheTiInteressaP[] = {
"riga 1 "
"riga 2 "
"riga 3 "
"riga 4 "
"riga n "
};
#endif
Per inciso: questo e' lo stesso metodo che si usa per
includere risorse grafiche in programmi per Unix. I file
".xpm", ad esemprio, sono dei normali file di testo.
HTH
C:\>iao Angelo

Ciao Angelo, grazie della risposta, avevo già adottato una soluzione
simile alla tua soltanto che nel caso (purtroppo il mio) i file siano
molto molto lunghi la cosa diventa complicata, per intenderci sono
file di testo tratti da manuali di gioco che vengono aggiornati di
continuo dagli utenti e quindi mi ritroverei ad ogni aggiornamento a
scrivere linee di codice, mentre io vorrei solo sostituire il file nel
progetto e ricompilare. Una cosa del genere sono riuscito a farla in
C# con assembly ma ora devo portare il tutto in MFC e sono bloccato da
questa cosa. Proprio per il motivo che ti dicevo sopra non posso
lasciare i file di testo esterni al progetto perchè non voglio che gli
utenti possano modificarli a piacimento.
Grazie ancora
Alberto

qualcosa che sbaglio?
L'esempio l'ho testato col VC6 compilato NON UNICODE.
Prova ad attivare il debug e leggi p dopo la LockResource.
Se l'indirizzo di posta è valido ti mando il progetto.

 ha scritto:

Ciao Goodidea,
il contenuto di Buf = " ÿþA " l'ho trovato proprio con il debug (il
debug è il mio migliore amico :) ), in pratica mi prende solo il primo
carattere del file di testo, in questo caso la "A". Di questo ne sono
sicuro, perchè cambiando la prima lettera del file di testo cambia
anche il contenuto di Buf. Effetivamente l'unica cosa che non ho
controllato è se sto compilando NON UNICODE, dopo la LockResource ho
quel che sembra un indirizzo valido, anche perchè il primo carattere,
come detto prima, è valido.
L'indirizzo di posta è valido, grazie mille per l'aiuto, davvero
tanto.
saluti
alberto

carattere del file di testo, in questo caso la "A".
E' molto più probabile che in Buf ci sia tutto il contenuto del file, è la
visualizzazione che si ferma al primo carattere, perché nella
rappresentazione unicode è "A\0", e MessageBox considera terminata la
stringa al primo carattere null che incontra.
Ciao.

,

Ciao, mi sembra strano che ci sia tutto il file, se vado ad inserire
nel debug variabili fittizie (Buf[0],Buf[1],Buf[2],Buf[3]...) vedo
solo la prima lettera. Magari sto prendendo una cantonata ma non
capisco il perchè.
Ciao e grazie
Alberto

capisco il perchè.
Nella codifica unicode, molti caratteri (quasi tutti i caratteri latini)
sono rappresentati da due byte, di cui il primo è il codice ansi del
carattere, e il secondo il carattere nullo '\0'. Se lavori con funzioni non
unicode su stringhe unicode, ti fermerai sempre al primo carattere nullo
che incontri. All'inizio del buffer c'è probabilmente la dichiarazione
della codifica utilizzata. Poi può anche darsi che ci sia qualche problema
fin dal recupero della risorsa, ma da quello che dici mi pare più probabile
che le cose stiano in questo modo.
Ciao.

 #endif
e il motivo dell'#ifndef/#define sarebbe? se è perché quel codice intendi
metterlo in un header esiste anche extern.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it