Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[MFC] - DeleteFile vs FreeLibrary problem

[es] :: C/C++ programiranje :: [MFC] - DeleteFile vs FreeLibrary problem

[ Pregleda: 2216 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-3.sezampro.yu.



+395 Profil

icon [MFC] - DeleteFile vs FreeLibrary problem07.04.2008. u 17:56 - pre 195 meseci
Problem je sledeci :
Imam jedan .exe fajl i u njemu zapakovano jedan ili vise DLL-ova koje raspakujem pri start-u .
Pri zatvaranju programa hocu da se ovi dll-ovi obrisu
Code:

// OnClose event 
POSITION ps = mapModules.GetStartPosition() ;  
while (ps) 
{
LPCTSTR szModule = NULL ; 
HINSTANCE hInstance = NULL ; 
mapModules.GetNextAssoc(ps,szModule,hInstance) ; 
    
if (FreeLibrary(hInstance) )
{
   if (!DeleteFile(szModule)) 
   {
       TCHAR szMsg [MAX_PATH];  
       FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),NULL,szMsg,MAX_PATH,NULL) ; 
       MessageBox(szMsg,APP_NAME,MB_OK) ;  // Access denied !!!
    }
}

}


Medutim fajlovi se nikad ne obrisu i dobijem poruku Access denied ..
Napominjem da su dll-ovi sa Normal File atributima i da imam sistemske privilegije i da ih pri izlasku iz programa uredno obrisem iz explorera.
U toku runtime-a samo jednom pozivam LoadLibrary tako da reference count za taj dll bi trebao da je 0 .
Ima li neko ideju a da nije sa batch fajlovima .... ?


Viva lollapalooza
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: [MFC] - DeleteFile vs FreeLibrary problem07.04.2008. u 19:01 - pre 195 meseci
Jesi li probao neki Sleep izmedju FreeLibrary i DeleteFile ?
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-3.sezampro.yu.



+395 Profil

icon Re: [MFC] - DeleteFile vs FreeLibrary problem07.04.2008. u 20:00 - pre 195 meseci
Probao sam i to u rasponu od 100 -5000 ms izmedju poziva FreeLibrary i DeleteFile i dalje ista prica ..
Probao sam i opciju, negde sam video na nekom od ms-ovih foruma :
Code:

UnmapViewOfFile((LPCVOID)hInstance) ; 

na Msdnu slaba dokumentacija o ovoj fuknciji, meni radi tj. brise uredno fajlove al po unload-u .exe puca tako da mi ni to nije resenje.
hvala u svakom slucaju ..

Viva lollapalooza
 
Odgovor na temu

defufna
Novi Sad

Član broj: 35112
Poruke: 167
*.dynamic.sbb.rs.

Jabber: defufna@jabber.papla.pl


Profil

icon Re: [MFC] - DeleteFile vs FreeLibrary problem07.04.2008. u 20:04 - pre 195 meseci
Takođe možda bi mogao da probaš sam da učitaš bibiloteku, dakle bez LoadLibrary, direktno iz memorije, na ovom sajtu imaš opis kako

http://www.joachim-bauch.de/tutorials/load_dll_memory.html

nisam nikad probao tako da ne mogu baš da ti kažem kolko to rešenje šljaka :).
Sobe, apartmani u Crnoj Gori
http://www.123montenegro.com
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: [MFC] - DeleteFile vs FreeLibrary problem07.04.2008. u 20:14 - pre 195 meseci
> Medutim fajlovi se nikad ne obrisu i dobijem poruku Access denied ..
> Napominjem da su dll-ovi sa Normal File atributima i da imam sistemske privilegije i da ih pri izlasku iz programa uredno obrisem iz explorera.

Verovatno imaš još neku referencu na taj fajl. Ubaci breakpoint na FreeLibrary pa pokušaj onda brisanje van programa ili u redu gde je DeleteFile. Brisanje po završetku programa prolazi jer windows automatski zatvara sve handlove na taj fajl. Takođe možeš probati program Unlocker ili SysInternals ProcessExplorer, oni će ti ispisati ko sve drži dati fajl.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-3.sezampro.yu.



+395 Profil

icon Re: [MFC] - DeleteFile vs FreeLibrary problem07.04.2008. u 20:57 - pre 195 meseci
Citat:
@defufna
Takođe možda bi mogao da probaš sam da učitaš bibiloteku, dakle bez LoadLibrary, direktno iz memorije.

Imao sam takvu ideju na pocetku i dobra je jer je logican sled dogadjaja (ja te module vec imam u drugoj aplikaciji (kao fajlove) koja pravi ustvari izvrsni .exe)
al mi se nije dopalo da moram da zaronim u nightmare PE Headera :)
Hvala puno .. skinuo sam kod pa cu probati ako proradi okacicu ovde ako nekom treba ..

Citat:
@savkic
Verovatno imaš još neku referencu na taj fajl. Ubaci breakpoint na FreeLibrary pa pokušaj onda brisanje van programa ili u redu gde je DeleteFile. Brisanje po završetku programa prolazi jer windows automatski zatvara sve handlove na taj fajl.


Code:

HINSTANCE hInst = LoadLibrary(strFullName); 
// jedini poziv u exe-u za svaki dll - ako si mislio na te reference jer on u sustini kreira novi adress space na  heap-u 

if (hInst) 
{
 //standardni import pozivi iz regular dll-a posle se svodi na pozivanje funkcija ..
 NEWISOBJECT pfNewObject = (NEWISOBJECT)GetProcAddress(hInst,"NewISObject") ; 
  LOADXML pfLoadXMl = (LOADXML)GetProcAddress(hInst,"LoadXML") ; 
  FILTERMSG pfFilter = (FILTERMSG)GetProcAddress(hInst,"FilterDllMsg") ; 
.
.
.
}

Viva lollapalooza
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: [MFC] - DeleteFile vs FreeLibrary problem07.04.2008. u 22:37 - pre 195 meseci
> jedini poziv u exe-u za svaki dll - ako si mislio na te reference jer on u sustini kreira novi adress space na heap-u

Mislio sam na handlove dobijene sa CreateFile, dalje možda neki drugi dll koji koristiš koristi originalni dll, potom drugi exe itd. Evo prostog primera koji učitava neki dll, oslobađa ga i briše fajl, ako se otvori još neki handle (komentarisani redovi) brisanje neće proći. Probaj one programe i metod koje sam spomenuo u prošloj poruci, nešto drži taj dll.

Code:

int main(int argc, char* argv[])
{
    HMODULE hLib = LoadLibrary("Proba.dll"); 
    //HMODULE hLib2 = LoadLibrary("Proba.dll"); 
    //HANDLE hFile = CreateFile("Proba.dll", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
 
    FreeLibrary(hLib);
    DeleteFile("Proba.dll");

    return 0;
}



 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-a-1.sezampro.yu.



+395 Profil

icon Re: [MFC] - DeleteFile vs FreeLibrary problem08.04.2008. u 08:59 - pre 195 meseci
Pogledao sam vise puta ....Evo parceta koda gde koristim da bih zapisao fajl tj. dll
Code:

int nArgs = 0 ; 
LPWSTR* szArgs = CommandLineToArgvW(GetCommandLine(),&nArgs) ;

ISMODULE module ; 
file.Read(&module,sizeof(ISMODULE)) ;
ULONGLONG lCurrPos =  file.GetPosition(); 
CString strDLL ; 
strDLL.Format(_T("%s\\%s"),GetFilePath(szArgs[0]),module.szName) ; 
char* szModule = new char [module.dwSize] ; 
file.Read(szModule,module.dwSize);  
CFile DLLFile (strDLL,CFile::modeCreate | CFile::modeWrite) ; 
DLLFile.Write(szModule,module.dwSize) ; 
DLLFile.Close () ;  //zatvaram fajl i nigde ga vise otvaram 
SetFileAttributes(strDLL,FILE_ATTRIBUTE_NORMAL); 
delete [] szModule ; 



Citat:

@savkic
.. dalje možda neki drugi dll koji koristiš koristi originalni dll, potom drugi exe itd

Iskljucena mogucnost.Nema nikakve uzajamnosti medju modulima ..
Hvala ti puno .. probacu jos ako proradi javljam ...

Viva lollapalooza
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: [MFC] - DeleteFile vs FreeLibrary problem08.04.2008. u 17:23 - pre 195 meseci
Definitivno bug zahvaljujuci meni ...
Imao sam jos jedan LoadLibrary u destruktoru jedne klase .
Sad radi !!!


Viva lollapalooza
 
Odgovor na temu

[es] :: C/C++ programiranje :: [MFC] - DeleteFile vs FreeLibrary problem

[ Pregleda: 2216 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.