Last active
July 5, 2020 20:22
-
-
Save CarlTBarnes/9fcde37b3b5278083cb594244fb9361f to your computer and use it in GitHub Desktop.
LoadLibrary Example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
!--Step 1.-- Define MAP with Function that has DLL(1) or DLL(_fp_), and must have NAME() that matches LONG in step 2 | |
MAP | |
GetProcsByName PROCEDURE(BYTE ShowErrors=0),BOOL | |
MODULE('Win32') | |
SetWindowDisplayAffinity PROCEDURE(SIGNED hWnd, UNSIGNED dwAffinity),BOOL,PROC,PASCAL,DLL(_fp_),NAME('SetWinDspAff') | |
! ^^^^ ^^^^^^^^^^^^ | |
LoadLibraryA PROCEDURE(*CSTRING pszModuleFileName),LONG,RAW,PASCAL,DLL(1) | |
FreeLibrary PROCEDURE(LONG hModule),BOOL,PASCAL,DLL(1),PROC | |
GetModuleHandleA PROCEDURE(*CSTRING lpModuleName),LONG,RAW,PASCAL,DLL(1) | |
GetProcAddress PROCEDURE(long HInstance,*cstring ProcName),LONG,PASCAL,RAW,DLL(1) | |
GetLastError PROCEDURE(),LONG,PASCAL,DLL(1) | |
END | |
MODULE('RTL') | |
!Alexey said to use these for Clarion built DLLs. I think these do AttachToThread() from RTL. | |
Clw_LoadLibrary PROCEDURE(*CSTRING pszModuleFileName),LONG,PASCAL,RAW,DLL(dll_mode),NAME('Clw$LoadLibrary') | |
Clw_FreeLibrary PROCEDURE(LONG hModule),LONG,PASCAL,PROC,DLL(dll_mode),NAME('Clw$FreeLibrary') | |
END | |
END | |
!--Step 2.-- Define LONG with same NAME() | |
SetWinDspAff_fp LONG,NAME('SetWinDspAff') | |
! ^^^^^^^^^^^^ MUST match Name() in Procedure(). Thank you Larry Sand! | |
!--Step 3.-- Define Function to LoadLibrary and GetProc. I know User32.DLL is loaded so used GetModuleHandleA | |
GetProcsByName PROCEDURE(BYTE ShowErrors=0)!,BOOL | |
hDll LONG,AUTO | |
hProc LONG,AUTO | |
DllName CSTRING('user32.dll') | |
ProcName CSTRING('SetWindowDisplayAffinity') | |
CODE | |
IF ~SetWinDspAff_fp THEN | |
SetWinDspAff_fp=-1 !set to -1 if failed to Get | |
hDll=GetModuleHandleA(DllName) | |
IF hDll THEN | |
hProc=GetProcAddress(hDll, ProcName) | |
IF hProc THEN | |
SetWinDspAff_fp=hProc | |
ELSIF ShowErrors THEN | |
Message('GetProcsByName GetProcAddress(' & hDll &','& ProcName &')||Error ' & GetLastError()) | |
END | |
ELSIF ShowErrors THEN | |
Message('GetProcsByName GetModuleHandleA(' & DllName &')||Error ' & GetLastError()) | |
END | |
END | |
RETURN CHOOSE(SetWinDspAff_fp<>-1) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment