Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 8 odgovora
  • 3.178 pregleda

Najnovija ↓

[MFC] - DeleteFile vs FreeLibrary problem 07.04.2008. u 18:56 · pre 226 meseci #1
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 .... ?

Potpis
Viva lollapalooza
Re: [MFC] - DeleteFile vs FreeLibrary problem 07.04.2008. u 21:00 · pre 226 meseci #3
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 ..
Potpis
Viva lollapalooza
Re: [MFC] - DeleteFile vs FreeLibrary problem 07.04.2008. u 21:04 · pre 226 meseci #4
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 :).
Potpis
Sobe, apartmani u Crnoj Gori
http://www.123montenegro.com
Re: [MFC] - DeleteFile vs FreeLibrary problem 07.04.2008. u 21:14 · pre 226 meseci #5
> 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.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: [MFC] - DeleteFile vs FreeLibrary problem 07.04.2008. u 21:57 · pre 226 meseci #6
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") ; 
.
.
.
}
Potpis
Viva lollapalooza
Re: [MFC] - DeleteFile vs FreeLibrary problem 07.04.2008. u 23:37 · pre 226 meseci #7
> 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;
}


Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: [MFC] - DeleteFile vs FreeLibrary problem 08.04.2008. u 09:59 · pre 226 meseci #8
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 ...
Potpis
Viva lollapalooza
Re: [MFC] - DeleteFile vs FreeLibrary problem 08.04.2008. u 18:23 · pre 226 meseci #9
Definitivno bug zahvaljujuci meni ...
Imao sam jos jedan LoadLibrary u destruktoru jedne klase .
Sad radi !!!

Potpis
Viva lollapalooza
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme