xoru icon

Untitled

xoru | PRO | 08/18/12 03:15:54 PM UTC | 0 ⭐ | 6989 👁️ | Never ⏰ | []
PureBasic |

3.68 KB

|

None

|

0 👍

/

0 👎

#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

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎