robust_excel_ole 1.39 → 1.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|