PDA

View Full Version : [C/C++]Come creare DLL con devc++?


$te
30-12-2007, 22:41
ho un programma e vorrei ke dei file testo e la maggiorparte del codice sia in formato dll, come fare? ho provato a creare un progetto(con devc++) x DLL e poi sotto parametri ho messo l'exe del programma principale, xo poi mi kiedo: questo mi creare + file: mi basta prendere il file .dll da affiancare al programma principale? ma soprattt come faccio ad inserire un file d testo? o nn é possibile?
grazie

variabilepippo
30-12-2007, 22:51
ho un programma e vorrei ke dei file testo e la maggiorparte del codice sia in formato dll


Questa richiesta è a dir poco criptica. :mbe:

$te
30-12-2007, 23:13
cioé? scusa la mia ignoranza in materia....

variabilepippo
30-12-2007, 23:25
cioé?


Non è assolutamente chiaro ciò che vuoi realizzare, spiegati meglio.

$te
30-12-2007, 23:35
in pratica vorrei rakkiudere in un file(una dll kredo faccia al caso mio) piu file d testo, ke xo nel programma io utilizzo aprendoli e modificandoli

marko.fatto
31-12-2007, 12:12
in pratica vorrei rakkiudere in un file(una dll kredo faccia al caso mio) piu file d testo, ke xo nel programma io utilizzo aprendoli e modificandoli

una dll è una libreria lincata dinamicamente...

quindi se devi metterci solo testo perchè dovresti fare una dll?:mbe:

variabilepippo
31-12-2007, 12:22
in pratica vorrei rakkiudere in un file(una dll kredo faccia al caso mio) piu file d testo


Potresti farlo aggiungendo staticamente i file di testo alle risorse della DLL ma poi sei costretto ad usare una funzione tipo questa (presa dal codice di un progetto open-source, non è il massimo dell'eleganza ma serve per rendere l'idea) per estrarli:


bool ExtractSupportFile(int nResourceID, const char *szFilename) {
HRSRC hrsrc;
int cb;
int cbWritten;
HGLOBAL hFileRes;
PVOID pFileContents;
HANDLE hFile;

if (NULL == (hrsrc = FindResource(hAppInstance, MAKEINTRESOURCE(nResourceID),
TEXT("RES_EMBEDDED_EXE")))) {
return false;
}
if (!(cb = SizeofResource(hAppInstance, hrsrc))) {
return false;
}
if (NULL == (hFileRes = LoadResource(hAppInstance, hrsrc))) {
return false;
}
if (NULL == (pFileContents = LockResource(hFileRes))) {
return false;
}
if (INVALID_HANDLE_VALUE == (hFile = CreateFile(szFilename,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL))) {
// If and only if we failed because we get access denied, try to continue anyway
// FIXME This needs to go away and the underlying problem solved
if (GetLastError() == ERROR_ACCESS_DENIED && PathFileExists(szFilename)) {
FreeResource(hFileRes);
return true;
}
return false;
}

if (!(WriteFile(hFile, pFileContents, cb, (LPDWORD)&cbWritten, NULL))) {
// If and only if we failed because we get access denied, try to continue anyway
if (!PathFileExists(szFilename)) {
return false;
}
}
CloseHandle(hFile);
FreeResource(hFileRes);
return true;
}


Esistono soluzioni migliori, però dovresti spiegare cosa stai implementando di preciso.

$te
31-12-2007, 12:22
voglio ke i file testo non possano essere visualizzati e modificati da altri se nn il programma

$te
31-12-2007, 12:25
Potresti farlo aggiungendo staticamente i file di testo alle risorse della DLL ma poi sei costretto ad usare una funzione tipo questa (presa dal codice di un progetto open-source, non è il massimo dell'eleganza ma serve per rendere l'idea) per estrarli:


bool ExtractSupportFile(int nResourceID, const char *szFilename) {
HRSRC hrsrc;
int cb;
int cbWritten;
HGLOBAL hFileRes;
PVOID pFileContents;
HANDLE hFile;

if (NULL == (hrsrc = FindResource(hAppInstance, MAKEINTRESOURCE(nResourceID),
TEXT("RES_EMBEDDED_EXE")))) {
return false;
}
if (!(cb = SizeofResource(hAppInstance, hrsrc))) {
return false;
}
if (NULL == (hFileRes = LoadResource(hAppInstance, hrsrc))) {
return false;
}
if (NULL == (pFileContents = LockResource(hFileRes))) {
return false;
}
if (INVALID_HANDLE_VALUE == (hFile = CreateFile(szFilename,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL))) {
// If and only if we failed because we get access denied, try to continue anyway
// FIXME This needs to go away and the underlying problem solved
if (GetLastError() == ERROR_ACCESS_DENIED && PathFileExists(szFilename)) {
FreeResource(hFileRes);
return true;
}
return false;
}

if (!(WriteFile(hFile, pFileContents, cb, (LPDWORD)&cbWritten, NULL))) {
// If and only if we failed because we get access denied, try to continue anyway
if (!PathFileExists(szFilename)) {
return false;
}
}
CloseHandle(hFile);
FreeResource(hFileRes);
return true;
}


Esistono soluzioni migliori, però dovresti spiegare cosa stai implementando di preciso.

questo codice serve per modificare i file testo rakkiusi nelle dll? mi sembra un po complicato, ma soprattt io non ho capito come rakkiudere questi file testo in una dll

variabilepippo
31-12-2007, 12:29
questo codice serve per modificare i file testo rakkiusi nelle dll? mi sembra un po complicato, ma soprattt io non ho capito come rakkiudere questi file testo in una dll


No, quel codice serve soltanto per estrarre dei file memorizzati sotto forma di risorsa in una DLL. In realtà è veramente banale, se ti sembra "un po' complicato" forse (per il momento) dovresti puntare su qualcosa di meno ambizioso. Comunque per includere i file testuali nella DLL devi aggiungerli nella definizione del file di risorse (.RC) del progetto. Ma ripeto, se il codice proposto ti sembra poco chiaro allora ti conviene studiare le funzioni della Windows API prima di proseguire.

$te
31-12-2007, 12:36
nn ho ben capito (sto imparando ad usare le api...ma ho ancora molto da imparare:P) come devo ajjunjere i file d testo?

marko.fatto
31-12-2007, 12:44
se vuoi avere un file di testo non accessabile (almeno non facilmente) criptalo prima di salvarlo...

$te
01-01-2008, 12:14
ha rajone!
io utilizzo dec++: x creare una dll creo un progetto e seleziono dll, ma poi cosé il risultato? cioé: io ho il mio programma con + file..ricompilo ke codice? e poi metto come parametro il file .exe del mio programma
...sono un po confuso

cionci
01-01-2008, 13:23
Se metti i file di testo nella dll come risorsa in ogni caso sono modificabili anche dall'esterno.
La soluzione che possa rendere quantomeno più difficile modificare i file e leggerli è usare un qualche algoritmo per criptare i file di testo.

$te
01-01-2008, 22:32
il problema é ke anke se criptato, uno potrebbe cmq cancellare il tutto, é questo il mio problema, come faccio quindi? x quello avevo pensato a delle .dll...o cmq un file ke rakkiude piu file testo, accessibile solo dal mio programma

variabilepippo
01-01-2008, 22:44
il problema é ke anke se criptato, uno potrebbe cmq cancellare il tutto, é questo il mio problema, come faccio quindi? x quello avevo pensato a delle .dll...o cmq un file ke rakkiude piu file testo, accessibile solo dal mio programma


Anche le DLL possono essere cancellate... :rolleyes:

Prova a spiegare che tipo di applicazione stai realizzando (NEL DETTAGLIO!), solo così è possibile darti qualche consiglio mirato. Cosa contengono questi famigerati file testuali?

71104
01-01-2008, 23:19
il problema é ke anke se criptato, uno potrebbe cmq cancellare il tutto, é questo il mio problema, come faccio quindi? x quello avevo pensato a delle .dll...o cmq un file ke rakkiude piu file testo, accessibile solo dal mio programma se non vuoi che vengano cancellati lavora col sistema di sicurezza (reimposta i permessi sui files, e intendo fallo a mano dall'esterno, non da dentro il programma via codice). se non ti è possibile significa che stai commettendo qualche errore concettuale...

$te
01-01-2008, 23:23
in ke senso? lavorando sui ACL? sto cercando d capire come usare la GetSecurityInfo, xo faccio fatica:
int *pp, *p1,*p2,*p3,*p4,*p5;
pp = GetSecurityInfo(hwnd, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, p1,p2,p3,p4,p5);
qual é il problema? mi potresti fare un semplice esempio?
xo parliamo d codice dentro il programma justo?

cionci
02-01-2008, 07:58
Ti stiamo dicendo che anche un DLL può essere aperta tramite un editor di risorse e modificata...anche se le stringhe le includi direttamente come variabili condivise nella DLL possono essere modificate con un editor esadecimale.
Se ti cancellano una file TXT esterno puoi rilevare la modifica e far smettere di funzionare il programma ;)

$te
02-01-2008, 09:47
ma quindi un file dll puoi aprilrlo e vedere il suo contenuto? xké il problema ke questo programma deve continuare ad andare:P ma allora se le dll sono modificabili, esiste un modo per includere in una cartella o in un file altri file xo ke sia impossibile (o quasi) da riaprire e quindi da leggere il contenuto?

cionci
02-01-2008, 09:52
esiste un modo per includere in una cartella o in un file altri file xo ke sia impossibile (o quasi) da riaprire e quindi da leggere il contenuto?
Se fosse possibile non pensi che tutti i produttori di videogiochi lo utilizzerebbero ?
Cerchiamo di spostare il problema altrove: su che tipo di macchine andrai ad utilizzare questo programma ? L'installazione la fai te ?
In tal caso come dice 71104 potresti andare a creare una cartella dati inaccessibile da parte degli utenti, ma accessibile solamente dal tuo programma (che magari viene lanciato da un servizio che gira in background con un determinato utente).

$te
02-01-2008, 10:07
si appunto ankio avevo pensato una cosa del genere: le mie dll le sposto in cartelle vicino a system32, cosi nessuno mai penserebbe d cancellarle:P ora ho una domanda un po stupida forse: qnd si fa un progetto usando magari piu file .cpp, compilando si crea il file .exe e un altro paio di file: se io cancello tutti i file eccetto l'exe, il programma funzionare alla perfezione justo? l'unico problema sara ke non potro piu aprire il progetto, vero?

cionci
02-01-2008, 10:11
si appunto ankio avevo pensato una cosa del genere: le mie dll le sposto in cartelle vicino a system32, cosi nessuno mai penserebbe d cancellarle:P
Non è che c'entri molto con quello che ti avevo detto io :D
ora ho una domanda un po stupida forse: qnd si fa un progetto usando magari piu file .cpp, compilando si crea il file .exe e un altro paio di file: se io cancello tutti i file eccetto l'exe, il programma funzionare alla perfezione justo? l'unico problema sara ke non potro piu aprire il progetto, vero?
Dipende da come è strutturato il tuo programma...se ti produce solo l'exe e non ha bisogno di file esterni allora dovrebbe andare tutto alla perfezione.

71104
02-01-2008, 12:53
per quale assurdo motivo vorresti cancellarti i sorgenti? :D
ribadisco un consiglio già dato precedentemente: adotta una soluzione crittografica (e facci capire meglio cosa devi fare).

marko.fatto
02-01-2008, 13:02
per quale assurdo motivo vorresti cancellarti i sorgenti? :D
ribadisco un consiglio già dato precedentemente: adotta una soluzione crittografica (e facci capire meglio cosa devi fare).

forse intendeva chiedere cos'è quello che deve copiarsi come release del programma :stordita:

$te
02-01-2008, 14:34
il mio é un programma ke funziona in background fatto x limitare l'accesso a msn a mia sorellina (4 ore su msn al jorno mi sembrano troppe:P). Quindi lei nn deve poter trovare il programma e poterlo kiudere: il file exe lo kiamo winlogon cosi nn puoi kiuderlo, poi ho un paio d file testo ke il programma usa, questi li volevo mettere lontani dal file exe in modo ke mia sorella nn possa trovarli. Quindi vorrei avere in tutto: il file .exe e i due file testo ke utilizzo nascosti, senza tenere i file sorgenti, é possibile? in quali occasioni non devo cancellare(spostare) i file sorgenti? grazie

71104
02-01-2008, 15:59
da quando in qua è impossibile terminare i processi di nome winlogon.exe? :mbe:

cionci
02-01-2008, 16:49
E soprattutto come fa tua sorella a sapere cosa e dove cercare per chiudere un'applicazione...metti semplicemente il file di testo a giro per il disco e il problema non si pone.
Poi al limite se la tua applicazione non riesce a partire perché il file di testo è stato eliminato blocca completamente l'uso di MSN ;)

$te
02-01-2008, 17:13
da quando in qua è impossibile terminare i processi di nome winlogon.exe? :mbe:

prova! dice ke é un processo d sistema e nn lascia terminare il processo

ma quindi ke scopo hanno le DLL??

cionci
02-01-2008, 17:18
ma quindi ke scopo hanno le DLL??
Prima di tutto condividere codice binario caricato a runtime fra più eseguibili...

71104
02-01-2008, 17:44
prova! dice ke é un processo d sistema e nn lascia terminare il processo ommioddio O_O'
hai ragione!!! :rotfl: :rotfl: :rotfl: :rotfl:

è perché il TaskManager non incontra realmente un errore nel tentativo di terminazione: semplicemente vede che il nome corrisponde a uno di quelli che lui si tiene in una lista di processi critici e quindi si rifiuta di terminarlo :D
questa da Microsoft non me l'aspettavo :rotfl:

cionci
02-01-2008, 18:07
Cavolo è davvero lollosa questa :eek: :asd: :rotfl:

variabilepippo
02-01-2008, 18:29
So che esiste una lista di nomi di processi "sensibili" però su Vista non ho avuto problemi nel terminare con il mio task manager di fiducia (Process Explorer (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)) un processo chiamato winlogon.exe. :sofico: