Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ISM_BASE = #WM_APP + $B000
- #ISB_SEND = #ISM_BASE + 1
- Procedure.i ImagineSharedMemoryProc(hWnd, uMsg, wParam, lParam)
- Protected WinProc.i = GetProp_(hWnd, "ImagineSharedMemory_WinProc")
- Protected *L = GetProp_(hWnd, "ImagineSharedMemory_Lua")
- Protected Reference = 0
- Protected Result = 0
- Select uMsg
- Case #ISB_SEND
- Reference = GetProp_(hWnd, "ImagineSharedMemory_FuncRef")
- If(Reference And *L)
- Protected *lpTemp = AllocateMemory(lParam)
- If(*lpTemp)
- ReadWindowProcessMemory(*hWnd, wParam, *lpTemp, lParam)
- luaX_restoreref(*L, Reference)
- If(lua_isfunction(*L, 1))
- lua_pushinteger(*L, *lpTemp)
- lua_pushinteger(*L, lParam)
- lua_call(*L, 2, 0)
- EndIf
- lua_remove(*L, 1)
- FreeMemory(*lpTemp)
- EndIf
- EndIf
- Case #WM_DESTROY
- SetWindowLong_(hWnd, #GWL_WNDPROC, WinProc)
- Protected *lpszString = GetProp_(hWnd, "ImagineSharedMemory_Name")
- If(*lpszString)
- FreeMemory(*lpszString)
- EndIf
- Reference = GetProp_(hWnd, "ImagineSharedMemory_FuncRef")
- If(Reference And *L)
- luaX_removeref(*L, Reference)
- EndIf
- ; remove the props from the host object
- RemoveProp_(hWnd, "ImagineSharedMemory_Name")
- RemoveProp_(hWnd, "ImagineSharedMemory_NameL")
- RemoveProp_(hWnd, "ImagineSharedMemory_FuncRef")
- RemoveProp_(hWnd, "ImagineSharedMemory_Init")
- RemoveProp_(hWnd, "ImagineSharedMemory_WinProc")
- RemoveProp_(hWnd, "ImagineSharedMemory_Lua")
- EndSelect
- ProcedureReturn CallWindowProc_(WinProc, hWnd, uMsg, wParam, lParam)
- EndProcedure
- ProcedureC SharedMemory_Init(*L)
- ; clear any error code
- IRLUA_PLUGIN_ResetLastError(*L)
- ; check the number of arguments
- IRLUA_PLUGIN_CheckNumArgs(*L, 2)
- Protected WindowID.s = IRLUA_PLUGIN_CheckString(*L, 1)
- lua_remove(*L, 1)
- Protected IsFunc.i = IRLUA_PLUGIN_CheckFunction(*L, 1)
- Protected hWnd.i = IRLUA_PLUGIN_GetWindowHandle(*L)
- If IsWindow_(hWnd)
- Protected Initialized.i = GetProp_(hWnd, "ImagineSharedMemory_Init")
- If(Initialized)
- lua_pushboolean(*L, 0)
- Else
- Protected Ref.i = luaX_storeref(*L)
- Protected *lpszString = AllocateMemory(Len(WindowID) + 1)
- Protected dwLength.l = Len(WindowID)
- PokeS(*lpszString, WindowID)
- SetProp_(hWnd, "ImagineSharedMemory_Name", *lpszString)
- SetProp_(hWnd, "ImagineSharedMemory_NameL", dwLength)
- SetProp_(hWnd, "ImagineSharedMemory_FuncRef", Ref)
- SetProp_(hWnd, "ImagineSharedMemory_Init", 1)
- SetProp_(hWnd, "ImagineSharedMemory_Lua", *L)
- Protected OldProc.i = SetWindowLong_(hWnd, #GWL_WNDPROC, @ImagineSharedMemoryProc())
- SetProp_(hWnd, "ImagineSharedMemory_WinProc", OldProc)
- lua_pushboolean(*L, 1)
- EndIf
- EndIf
- ProcedureReturn 1
- EndProcedure
- ProcedureC SharedMemory_SendBuffer(*L)
- ; clear any error code
- IRLUA_PLUGIN_ResetLastError(*L)
- ; check the number of arguments
- IRLUA_PLUGIN_CheckNumArgs(*L, 3)
- Protected WindowID.s = IRLUA_PLUGIN_CheckString(*L, 1)
- Protected *lptrBuffer = IRLUA_PLUGIN_CheckNumber(*L, 2)
- Protected dwSize.l = IRLUA_PLUGIN_CheckNumber(*L, 3)
- Protected Dim hWnds.l(0)
- Protected c = findISMWindows(WindowID, hWnds())
- If(c)
- For i = 0 To c - 1
- SendMessage_(hWnds(i), #ISB_SEND, *lptrBuffer, dwSize)
- Next
- lua_pushboolean(*L, 1)
- Else
- lua_pushboolean(*L, 0)
- EndIf
- ProcedureReturn 1
- EndProcedure
Advertisement