home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.asm.x86      Ahh, the lost art of x86 assembly      4,675 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 4,474 of 4,675   
   George Neuner to address@nospicedham.not.available   
   Re: [OT?] Borlands Tasm32 syntax for cal   
   21 Jul 22 11:55:30   
   
   From: gneuner2@nospicedham.comcast.net   
      
   On Thu, 21 Jul 2022 15:43:03 +0200, "R.Wieser"   
    wrote:   
      
   >George,   
   >   
   >> Sorry, I never used Tasm (any version), but WRT to GetProcAddress   
   >> I don't believe there is any other way to guarantee you will get   
   >> the right function.   
   >   
   >There is, and I mentioned it just below the 'GetProcAddress' method.   
      
   Yes, but it involved recompiling the module.  Most people are not in a   
   position to rebuild system DLLs, so that isn't a general solution.   
      
      
   >> If you know the DLL is already resident you should use GetModuleHandle   
   >> instead of LoadLibrary.   
   >   
   >Does it make a difference ? (whats the 'should' about ?)   
      
   'should' means it is the best choice ... at least under the given   
   circumstances.   
      
      
   And it does make a difference, which I explained previously and will   
   expound on now:   
      
      
   LoadLibrary manipulates reference counts on the loaded module and   
   every call to LoadLibrary has to be paired with a call to FreeLibrary.   
   Unbalanced calls to LoadLibrary can cause a shared DLL to end up   
   locked into memory.   
   [Note that application exit automatically calls FreeLibrary for all   
   DLLs attached to the process.  So application exit will balance one   
   LoadLibrary call for any given library.]   
      
   GetModuleHandle just searches for an already loaded module and returns   
   a handle to it (that can be passed to GetProcAddress).   
      
      
   If you are dealing with an already loaded DLL (for which you don't   
   have a handle available), you have to do one of the following:   
   (in C)   
      
      hnd = GetModuleHandle( "ComCtl32" );   
      ptr = GetProcAddress( hnd, "DllGetVersion" );   
      
   or   
      
      hnd = LoadLibrary( "ComCtl32" );   
      ptr = GetProcAddress( hnd, "DllGetVersion" );   
      FreeLibrary( hnd );   
      
   Whenever you call LoadLibrary, you also have to call FreeLibrary   
   UNLESS you are deliberately loading a /new/ DLL and intend it to   
   remain resident until application exit.  And if you do deliberately   
   load something, you 'should' (best practice) save the returned handle   
   because it is simpler than having to discover it again later.   
      
      
   I realize the documentation[1,2] says application exit frees libraries   
   regardless of reference counts ... but "free" in this case means   
   "detached from your process" and it does not necessarily mean the   
   library can or will be be unloaded from memory.  In particular, if the   
   library instantiates one or more COM objects based on LoadLibrary   
   calls (which in general you can't know), and those loads are not   
   balanced by FreeLibrary calls, the library will never be unloaded (ie.   
   it will be locked into memory).   
      
   NB: DLLs in Windows can have their own private heaps not associated   
   with any client process.  Objects created on a private heap on behalf   
   of a client process might be able to survive the termination of that   
   process.  COM objects have their own reference counts which are   
   unrelated to reference counts on the module that implements them.   
   Windows will not unload any module that still has live COM objects.   
      
   To be safe you need to make sure you always balance explicit   
   LoadLibrary calls with FreeLibrary calls.   
      
      
   >Regards,   
   >Rudy Wieser   
      
   Hope this helps.   
   George   
      
   [1]   
   https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/   
   f-libloaderapi-loadlibrarya   
   [2]   
   https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/   
   f-libloaderapi-freelibrary   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca