[ deerbeer @ 07.04.2008. 17:56 ] @
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 .... ?

[ X Files @ 07.04.2008. 19:01 ] @
Jesi li probao neki Sleep izmedju FreeLibrary i DeleteFile ?
[ deerbeer @ 07.04.2008. 20:00 ] @
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 ..
[ defufna @ 07.04.2008. 20:04 ] @
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 :).
[ savkic @ 07.04.2008. 20:14 ] @
> 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.
[ deerbeer @ 07.04.2008. 20:57 ] @
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") ; 
.
.
.
}
[ savkic @ 07.04.2008. 22:37 ] @
> 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;
}


[ deerbeer @ 08.04.2008. 08:59 ] @
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 ...
[ deerbeer @ 08.04.2008. 17:23 ] @
Definitivno bug zahvaljujuci meni ...
Imao sam jos jedan LoadLibrary u destruktoru jedne klase .
Sad radi !!!