-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQLuaController.py
More file actions
60 lines (54 loc) · 2.65 KB
/
QLuaController.py
File metadata and controls
60 lines (54 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# -*- coding: windows-1251 -*-
import mmap
import struct
import win32event # pip install pywin32
import time
import sys
def QLuaControllerStart(Filter="QLua"):
# Ñîçäàåì îáúåêò ñîáûòèÿ ãîòîâíîñòè áóôåðà äëÿ ïîëó÷åíèÿ îòëàäî÷íûõ ñîîáùåíèé
buffer_ready = win32event.CreateEvent(None, 0, 0, "DBWIN_BUFFER_READY")
# Ñîçäàåì îáúåêò ñîáûòèÿ ïîëó÷åíèÿ äàííûõ îòëàäî÷íîãî ñîîáùåíèÿ
data_ready = win32event.CreateEvent(None, 0, 0, "DBWIN_DATA_READY")
# Âûäåëÿåì ïàìÿòü ïîä áóôåð îáìåíà
# https://www.codeproject.com/Articles/23776/Mechanism-of-OutputDebugString
# DBWIN_BUFFER: It is the name of shared memory.
# Its size is 4K bytes, the first 4 bytes indicate the process id
# and the following is the content of debug string.
_buffer = mmap.mmap(0, 4096, "DBWIN_BUFFER", mmap.ACCESS_WRITE)
while True:
# Óñòàíàâëèâàåì ñîáûòèå ãîòîâíîñòè áóôåðà äëÿ ïîëó÷åíèÿ îòëàäî÷íûõ ñîîáùåíèé,
# ò.å. ðåãèñòðèðóåì "ïðîãðàììó-ëîâóøêó"
win32event.SetEvent(buffer_ready)
# Åñëè åñòü ñèãíàë ïîëó÷åíèÿ äàííûõ îòëàäî÷íîãî ñîîáùåíèÿ – îáðàáàòûâàåì åãî
if win32event.WaitForSingleObject(data_ready, 1) == win32event.WAIT_OBJECT_0:
_buffer.seek(0)
# Ïîëó÷àåì èäåíòèôèêàòîð ïðîöåññà, îòïðàâèâøåãî îòëàäî÷íîå ñîîáùåíèå
process_id, = struct.unpack("L", _buffer.read(4))
# Ñ÷èòûâàåì îòëàäî÷íîå ñîîáùåíèå èç áóôåðà îáìåíà
data = _buffer.read(4096)
try:
data_str = data.decode(encoding='utf-8')
except UnicodeDecodeError:
data_str = data.decode(encoding='cp1251')
#print(">>>", process_id, data_str)
# Ñ÷èòûâàåì ñòðîêó äî ñèìâîëà îêîí÷àíèÿ ñòðîêè, åñëè îí ïðèñóòñòâóåò
if "\0" in data_str:
str1 = data_str[:data_str.index("\0")]
# èíà÷å âñÿ ñòðîêà â áóôåðå ÿâëÿåòñÿ îòëàäî÷íûì ñîîáùåíèåì
else:
str1 = data_str
# Ïðîâåðÿåì ïðèñóòñòâèå ïîäñòðîêè Filter â ñîîáùåíèè,
# åñëè îíà ïðèñóòñòâóåò, ñ÷èòàåì, ÷òî
# îòëàäî÷íîå ñîîáùåíèå ïîëó÷åíî îò íàøåãî ñêðèïòà Lua
if str1.find(Filter) >= 0:
ticks = time.localtime()
# Âûâîäèì îòëàäî÷íîå ñîîáùåíèå â êîíñîëü
print("[%02d:%02d:%02d]: %s" % (ticks.tm_hour,
ticks.tm_min,
ticks.tm_sec,
str1))
if __name__ == '__main__':
if len(sys.argv) == 1:
QLuaControllerStart()
elif len(sys.argv) == 2:
QLuaControllerStart(sys.argv[1])