PDA

View Full Version : [visual c++] includere exe dentro altro exe


mamo139
20-09-2006, 17:57
vorrei inserire come risorsa dentro a un'applicazione un'altra applicazione da far partire qnd voglio...
come inserirla e come farla partire???
grazie mille!!!

andbin
20-09-2006, 18:07
vorrei inserire come risorsa dentro a un'applicazione un'altra applicazione da far partire qnd voglio...
come inserirla e come farla partire???Immagino che per "risorse" intendi le risorse gestite con i file .rc in Win32, giusto??

Per far partire l'exe devi comunque estrarre la risorsa, scriverla sul file system ed eseguire il file.

andbin
20-09-2006, 18:22
Sempre per quanto riguarda un file .rc, per includere una risorsa "custom" si deve usare un tipo di risorsa non standard.
Esempio:
ID_MIOEXE BINRES "miofile.exe"Ovviamente usando le funzioni di apertura delle risorse, si dovrà specificare come tipo "BINRES", che l'ho inventato io come nome ma può essere personalizzato.

mamo139
20-09-2006, 18:40
capito grazie... e per poi estrarlo ed eseguirlo come fare?? :confused:

andbin
20-09-2006, 20:35
poi estrarlo ed eseguirlo come fare?? :confused:Per leggere una risorsa si usano le funzioni Win32: FindResource, LoadResource, LockResource.
Per eseguire un file si può usare la funzione Win32: ShellExecute.

andbin
21-09-2006, 11:43
ooops, ne ho dimenticata una: serve anche la funzione SizeofResource. Per sapere la dimensione della risorsa.

mamo139
21-09-2006, 16:07
HGLOBAL resHandle = NULL;
HRSRC res;
char *resData;
int resSize;
FILE *fp;

FILE *err=fopen("ba.txt","wb");

res = FindResource(0, MAKEINTRESOURCE(IDR_BINRES1), BINRES);
if (!res) fprintf(err,"FindResource() fallita!");
else {
resHandle = LoadResource(0, res);
if (!resHandle) fprintf(err,"LoadResource() fallita!");

else {
resData = (char*)LockResource(resHandle);
resSize = SizeofResource(NULL, res);

if ((fp=fopen("myexe.exe","wb"))){
int i;

for (i=0; i < resSize ; i++) {
fputc(resData[i], fp);
fclose(fp);
}

//ShellExecute(0,"open","myexe.exe", 0, 0, SW_SHOWNORMAL);
}
else fprintf(err,"fopen() fallita!");
}
}



fclose(err);


res = FindResource(0, MAKEINTRESOURCE(IDR_BINRES1), BINRES);
a questa riga mi dice unencrared identifier... come rimediare??? grazie ciao :D

mamo139
21-09-2006, 20:11
ok risolto... ma ora avrei un'altra domanidina credo facile facile...
cosa devo includere per poter usare la funzione ShellExecute???? :muro:

andbin
21-09-2006, 20:36
res = FindResource(0, MAKEINTRESOURCE(IDR_BINRES1), BINRES);Come sicuramente hai intuito, BINRES deve essere una stringa. Quello che passi nel secondo parametro può essere invece una stringa oppure un identificativo numerico (il secondo, nel tuo caso).

for (i=0; i < resSize ; i++) {
fputc(resData[i], fp);
fclose(fp);
}No, così non va. Non devi mettere la fclose nel ciclo. ;) E poi comunque è molto meglio se usi una fwrite, così scrivi direttamente tutto il blocco di memoria sul file.

cosa devo includere per poter usare la funzione ShellExecute????<shellapi.h>. Assicurati anche che il linker effettui il link con shell32.lib!!

mamo139
21-09-2006, 21:00
1) Come sicuramente hai intuito, BINRES deve essere una stringa. Quello che passi nel secondo parametro può essere invece una stringa oppure un identificativo numerico (il secondo, nel tuo caso).

2) No, così non va. Non devi mettere la fclose nel ciclo. ;) E poi comunque è molto meglio se usi una fwrite, così scrivi direttamente tutto il blocco di memoria sul file.

3) <shellapi.h>. Assicurati anche che il linker effettui il link con shell32.lib!!

i punti 1 e 2 con fatica li avevo chiariti :D ... per il 3 grazie ora provo e ti faccio sapere

mamo139
22-09-2006, 20:33
perfetto funziona tutto... grazie mille