Create - DLL (LibMain)

Category: DLLs

Date: 03-28-2012

Return to Index


 
'This snippet is 1 of 4 covering creating a DLL. It demonstrates the
'use of LibMain for incorporating DLL startup/shutdown actions.
 
'Check out the background information on DLLs at http://gbl_00320
 
'Primary Code:
'This code shows using the #Compile DLL to direct the compiler to create
'a DLL rather than an EXE.  It shows the use of LibMain function that is
'called when the DLL is loaded and when it is unloaded. It also shows the
'use of two exported functions.
#Compile DLL
Function LibMain (ByVal hInstance&, ByVal fwdReason&, ByVal lpvReserved&) As Long
   '... load/unload code as needed
End Function
Function FlipCoin ALIAS "FlipCoin" (uLimit&) EXPORT As Long       'exported function
   '...  see details in compilable example below
End Function
Function PleaseWait ALIAS "PleaseWait" (hParent as Dword, wMsg$) EXPORT As Long  'exported function
   '...  see details in compilable example below
End Function
 
'The LibMain arguments consist of:
'  - hInstance: DLL instance handle, used by the calling application to identify the called DLL
'                 Use GetModuleHandle(ByVal 0&) to get the instance handle of the calling EXE.
 
'  - fwdReason is the reason the DLL is being called
'       %DLL_PROCESS_ATTACH       %DLL_THREAD_ATTACH
'       %DLL_PROCESS_DETACH       %DLL_THREAD_DETACH
 
'  - lpvReserved value depends on fdwReason:
'       %DLL_PROCESS_ATTACH, NULL (zero) for dynamic loads, non-NULL for static loads
'       %DLL_PROCESS_DETACH, NULL if called by FreeLibrary, non-NULL if called during process termination.
 
'Compilable Example:
'Using the compiler directive #Compile DLL is the key line, telling the
'compiler to create a DLL rather than an EXE. In this example, the
'DLL has two exported functions, accessible from the two buttons on the
'main dialog.  In this case, a LibMain function manages load/unload actions.
'The load-DLL code is simply initializes an array. The unload-DLL code saves
'the values to a file.  Load/unload actions take place unprompted by the user.
#Compiler PBWin 9, PBWin 10
#Compile DLL
%ID_Label = 500
Global MyArray() As String
 
Function PBLibMain
   Static i as Long
   Local j as long
   If i Then
      'run this on unload - save the array to a file
      Open "myfile.txtFor Output as #1
      Print #1, Join$(MyArray(), $crlf)
      Close #1
   Else
      'run this on load - initialize an array
      Dim MyArray(100)
      For j = 0 to UBound(MyArray) : MyArray(j)=Str$(Rnd(1,100)) : Next j
   End If
   Incr i
   Function = 1    'required or DLL will not load!
End Function
 
Function FlipCoin ALIAS "FlipCoin" (uLimit&) EXPORT As Long
   Function = Rnd(0,uLimit&)
End Function
 
Function PleaseWait ALIAS "PleaseWait" (hParent as Dword, wMsg$) EXPORT As Long
   Local x As Long, y As Long, w As Long, h As Long, wX As Long, wY As Long, hWait as Long
   Dialog Get Client hParent To w,h
   wX = 150 : wY = 60   'size of popup dialog
   x = (w-wX)/2    'gets left position of WaitDialog to center over app
   y = (h-wY)/2    'gets top position of WaitDialog to center over app
   Dialog New Pixels, hParent, "", x, y, wX, wY, %WS_Popup To hWait
   Control Add Label, hWait, %ID_Label, wMsg$, 0, 0, wX, wY, %SS_Center Or %SS_CenterImage Or %WS_Border
   Control Set Color hWait, %ID_Label, %Black, %White
   Dialog Show Modeless hWait
   Function = hWait
End Function
 
'gbs_00171
'Date: 03-10-2012


created by gbSnippets
http://www.garybeene.com/sw/gbsnippets.htm