robust_excel_ole 1.39 → 1.40
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/robust_excel_ole/excel.rb +85 -70
- data/lib/robust_excel_ole/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3d804db077d2eb3c4eaf9a14a0e16cefcf9b6ba62b28f5e72863b76adf1fea8
|
4
|
+
data.tar.gz: 72e7f2f169fa6a945380326c22b45921aa34785741fb4380317551db78a42596
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 188397edb880279b9c5510a6b625a11fde2b4c5366de48f90728c4689293d21096c397a4da10fe10f09ae67a234f686906b5245c6f0f9f3750e69a6c95d4ab82
|
7
|
+
data.tar.gz: 927aa043117fbbec3fd517ecc9e13ea522aebc87f04bacc84ffcf334df4c7a54f285480ef597bdb2505497ef450862446915dd1d0191e99128c2932f78ba260a
|
@@ -7,58 +7,64 @@ def ka
|
|
7
7
|
Excel.kill_all
|
8
8
|
end
|
9
9
|
|
10
|
-
=begin
|
11
10
|
module User32
|
12
11
|
# Extend this module to an importer
|
13
12
|
extend Fiddle::Importer
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
13
|
+
begin
|
14
|
+
# Load 'user32' dynamic library into this importer
|
15
|
+
dlload 'user32'
|
16
|
+
# Set C aliases to this importer for further understanding of function signatures
|
17
|
+
typealias 'HWND', 'HANDLE'
|
18
|
+
typealias 'HANDLE', 'void*'
|
19
|
+
typealias 'LPCSTR', 'const char*'
|
20
|
+
typealias 'LPCWSTR', 'const wchar_t*'
|
21
|
+
typealias 'UINT', 'unsigned int'
|
22
|
+
typealias 'ppvObject', 'void**'
|
23
|
+
typealias 'DWORD', 'unsigned long'
|
24
|
+
typealias 'LPDWORD', 'DWORD*'
|
25
|
+
typealias 'PDWORD_PTR', 'DWORD**'
|
26
|
+
typealias 'WPARAM', 'UINT*'
|
27
|
+
typealias 'LPARAM', 'INT*'
|
28
|
+
typealias 'LRESULT', 'DWORD'
|
29
|
+
# Import C functions from loaded libraries and set them as module functions
|
30
|
+
extern 'DWORD GetWindowThreadProcessId(HWND, LPDWORD)'
|
31
|
+
extern 'HWND FindWindowExA(HWND, HWND, LPCSTR, LPCSTR)'
|
32
|
+
extern 'DWORD SetForegroundWindow(HWND)'
|
33
|
+
extern 'LRESULT SendMessageTimeoutA(HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD_PTR)'
|
34
|
+
rescue Fiddle::DLError => e
|
35
|
+
#trace "user32.dll not found: #{e}"
|
36
|
+
end
|
34
37
|
end
|
35
38
|
|
36
39
|
module Oleacc
|
37
40
|
# Extend this module to an importer
|
38
41
|
extend Fiddle::Importer
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
42
|
+
begin
|
43
|
+
# Load 'oleacc' dynamic library into this importer
|
44
|
+
dlload 'oleacc'
|
45
|
+
# Set C aliases to this importer for further understanding of function signatures
|
46
|
+
typealias 'HWND', 'HANDLE'
|
47
|
+
typealias 'HANDLE', 'void*'
|
48
|
+
typealias 'ppvObject', 'void**'
|
49
|
+
typealias 'DWORD', 'unsigned long'
|
50
|
+
typealias 'HRESULT', 'long'
|
51
|
+
Guid = struct [
|
52
|
+
'unsigned long data1',
|
53
|
+
'unsigned short data2',
|
54
|
+
'unsigned short data3',
|
55
|
+
'unsigned char data4[8]'
|
56
|
+
]
|
57
|
+
# Import C functions from loaded libraries and set them as module functions
|
58
|
+
extern 'HRESULT AccessibleObjectFromWindow(HWND, DWORD, struct guid*, ppvObject)'
|
59
|
+
#typealias 'REFIID', 'struct guid*'
|
60
|
+
#extern 'HRESULT AccessibleObjectFromWindow(HWND, DWORD, REFIID, ppvObject)'
|
61
|
+
#extern 'HRESULT AccessibleObjectFromWindow(HWND, DWORD, struct GUID*, ppvObject)'
|
62
|
+
#extern 'HRESULT AccessibleObjectFromWindow(HWND, DWORD, void*, ppvObject)'
|
63
|
+
#extern 'HRESULT AccessibleObjectFromWindow(HWND, DWORD, struct GUID*, ppvObject)'
|
64
|
+
rescue Fiddle::DLError => e
|
65
|
+
#trace "oleacc.dll not found: #{e}"
|
66
|
+
end
|
60
67
|
end
|
61
|
-
=end
|
62
68
|
|
63
69
|
module RobustExcelOle
|
64
70
|
|
@@ -349,12 +355,16 @@ module RobustExcelOle
|
|
349
355
|
GC.start
|
350
356
|
sleep 0.1
|
351
357
|
if finishing_living_excel
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
+
if hwnd
|
359
|
+
begin
|
360
|
+
pid_puffer = ' ' * 32
|
361
|
+
User32::GetWindowThreadProcessId(hwnd, pid_puffer)
|
362
|
+
pid = pid_puffer.unpack('L')[0]
|
363
|
+
Process.kill('KILL', pid) rescue nil
|
364
|
+
rescue NoMethodError => e
|
365
|
+
# trace "#{e}"
|
366
|
+
end
|
367
|
+
end
|
358
368
|
@@hwnd2excel.delete(hwnd)
|
359
369
|
weak_xl.ole_free if weak_xl.weakref_alive?
|
360
370
|
end
|
@@ -557,29 +567,30 @@ module RobustExcelOle
|
|
557
567
|
self.Hwnd == other_excel.Hwnd if other_excel.is_a?(Excel) && alive? && other_excel.alive?
|
558
568
|
end
|
559
569
|
|
560
|
-
# def alive?
|
561
|
-
#msg = 0x2008
|
562
|
-
#wparam = 0
|
563
|
-
#lparam = 0
|
564
|
-
#flags = 0x0000 # 0x0002
|
565
|
-
#duration = 5000
|
566
|
-
#lpdw_result_puffer = ' ' * 32
|
567
|
-
#status = User32::SendMessageTimeoutA(hwnd, msg, wparam, lparam, flags, duration, lpdw_result_puffer)
|
568
|
-
#result = lpdw_result_puffer.unpack('L')[0]
|
569
|
-
#status != 0
|
570
|
-
# end
|
571
|
-
|
572
570
|
# returns true, if the Excel instances responds to VBA methods, false otherwise
|
573
571
|
def alive?
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
572
|
+
begin
|
573
|
+
msg = 0x2008
|
574
|
+
wparam = 0
|
575
|
+
lparam = 0
|
576
|
+
flags = 0x0000 # 0x0002
|
577
|
+
duration = 5000
|
578
|
+
lpdw_result_puffer = ' ' * 32
|
579
|
+
status = User32::SendMessageTimeoutA(hwnd, msg, wparam, lparam, flags, duration, lpdw_result_puffer)
|
580
|
+
result = lpdw_result_puffer.unpack('L')[0]
|
581
|
+
status != 0
|
582
|
+
rescue NoMethodError => e
|
583
|
+
#trace "#{e}"
|
584
|
+
begin
|
585
|
+
@ole_excel.Name
|
586
|
+
true
|
587
|
+
rescue
|
588
|
+
# trace $!.message
|
589
|
+
false
|
590
|
+
end
|
591
|
+
end
|
579
592
|
end
|
580
593
|
|
581
|
-
|
582
|
-
|
583
594
|
# returns unsaved workbooks in known (not opened by user) Excel instances
|
584
595
|
# @private
|
585
596
|
def self.unsaved_known_workbooks
|
@@ -741,8 +752,12 @@ module RobustExcelOle
|
|
741
752
|
|
742
753
|
def focus
|
743
754
|
self.visible = true
|
744
|
-
|
745
|
-
|
755
|
+
begin
|
756
|
+
status = User32::SetForegroundWindow(@ole_excel.Hwnd)
|
757
|
+
raise ExcelREOError, "could not set Excel window as foreground" if status == 0
|
758
|
+
rescue NoMethodError => e
|
759
|
+
raise ExcelREOError, "could not set Excel window as foreground because user32.dll not found"
|
760
|
+
end
|
746
761
|
end
|
747
762
|
|
748
763
|
# @private
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: robust_excel_ole
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.40'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- traths
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03-
|
11
|
+
date: 2022-03-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|