dde 0.2.9 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,159 +1,159 @@
1
- == Parameters ( win32-api )
2
- Long: 'L'
3
- Integer: 'I'
4
- Pointer: 'P'
5
- Void: 'V'
6
- String: 'S'
7
- Callback: 'K' # win32-api only
8
-
9
- == Windows Data Types
10
- BOOL => 'I' (or 'B', win32-api only)
11
- DWORD => 'L'
12
- HANDLE => 'L'
13
- LPDWORD => 'P' (or 'L')
14
- LPTSTR => 'P'
15
- LPCTSTR => 'S'
16
- UINT => 'L'
17
- VOID => 'V'
18
- WORD => 'I'
19
- LPVOID => 'L' (or 'P')
20
- CALLBACK => 'K'
21
-
22
- == C Data Types
23
- void => 'V'
24
- void* => 'P'
25
- char* => 'P'
26
- const char* => 'L'
27
- int => 'I'
28
- long => 'L'
29
- struct => 'P'
30
- struct* => 'P'
31
-
32
- == Notes
33
- In practice most LPVOID types should be designated as 'L' because this
34
- usually means the function is looking for an address. Check the documentation
35
- for details.
36
-
37
- If using the windows-api library, you can use 'B' instead of 'I' for the return
38
- type for functions that return a BOOL.
39
-
40
- ===== Definitions from windows-api (api.rb)
41
- # Verbose data types that can be used instead of single letters
42
- DATA_TYPES = {
43
- 'ATOM' => 'I',
44
- 'BOOL' => 'B',
45
- 'BOOLEAN' => 'B',
46
- 'BYTE' => 'I',
47
- 'CALLBACK' => 'K',
48
- 'CHAR' => 'I',
49
- 'COLORREF' => 'L',
50
- 'DWORD' => 'L',
51
- 'DWORDLONG' => 'L',
52
- 'DWORD_PTR' => 'P',
53
- 'DWORD32' => 'I',
54
- 'DWORD64' => 'L',
55
- 'HACCEL' => 'L',
56
- 'HANDLE' => 'L',
57
- 'HBITMAP' => 'L',
58
- 'HBRUSH' => 'L',
59
- 'HCOLORSPACE' => 'L',
60
- 'HCONV' => 'L',
61
- 'HDC' => 'L',
62
- 'HFILE' => 'I',
63
- 'HKEY' => 'L',
64
- 'HFONT' => 'L',
65
- 'HINSTANCE' => 'L',
66
- 'HKEY' => 'L',
67
- 'HLOCAL' => 'L',
68
- 'HMENU' => 'L',
69
- 'HMODULE' => 'L',
70
- 'HRESULT' => 'L',
71
- 'HWND' => 'L',
72
- 'INT' => 'I',
73
- 'INT_PTR' => 'P',
74
- 'INT32' => 'I',
75
- 'INT64' => 'L',
76
- 'LANGID' => 'I',
77
- 'LCID' => 'L',
78
- 'LCTYPE' => 'L',
79
- 'LONG' => 'L',
80
- 'LONGLONG' => 'L',
81
- 'LONG_PTR' => 'P',
82
- 'LONG32' => 'L',
83
- 'LONG64' => 'L',
84
- 'LPARAM' => 'P',
85
- 'LPBOOL' => 'P',
86
- 'LPBYTE' => 'P',
87
- 'LPCOLORREF' => 'P',
88
- 'LPCSTR' => 'P',
89
- 'LPCTSTR' => 'P',
90
- 'LPCVOID' => 'L',
91
- 'LPCWSTR' => 'P',
92
- 'LPDWORD' => 'P',
93
- 'LPHANDLE' => 'P',
94
- 'LPINT' => 'P',
95
- 'LPLONG' => 'P',
96
- 'LPSTR' => 'P',
97
- 'LPTSTR' => 'P',
98
- 'LPVOID' => 'L',
99
- 'LPWORD' => 'P',
100
- 'LPWSTR' => 'P',
101
- 'LRESULT' => 'P',
102
- 'PBOOL' => 'P',
103
- 'PBOOLEAN' => 'P',
104
- 'PBYTE' => 'P',
105
- 'PHKEY' => 'P',
106
- 'SC_HANDLE' => 'L',
107
- 'SC_LOCK' => 'L',
108
- 'SERVICE_STATUS_HANDLE' => 'L',
109
- 'SHORT' => 'I',
110
- 'SIZE_T' => 'P',
111
- 'TCHAR' => 'L',
112
- 'UINT' => 'I',
113
- 'UINT_PTR' => 'P',
114
- 'UINT32' => 'I',
115
- 'UINT64' => 'L',
116
- 'ULONG' => 'L',
117
- 'ULONGLONG' => 'L',
118
- 'ULONG_PTR' => 'P',
119
- 'ULONG32' => 'L',
120
- 'ULONG64' => 'L',
121
- 'USHORT' => 'I',
122
- 'USN' => 'L',
123
- 'WINAPI' => 'L',
124
- 'WORD' => 'I'
125
- }
126
-
127
- Win::Library shortcuts (Mostly in line with Array#pack)
128
- TYPES = {
129
- V: :void, # For functions that return nothing (return type void).
130
- v: :void, # For functions that return nothing (return type void).
131
- C: :uchar, #– 8-bit unsigned character (byte)
132
- c: :char, # 8-bit character (byte)
133
- # :int8 – 8-bit signed integer
134
- # :uint8 – 8-bit unsigned integer
135
- S: :ushort, # – 16-bit unsigned integer (Win32API: used for string)
136
- s: :short, # – 16-bit signed integer
137
- # :uint16 – 16-bit unsigned integer
138
- # :int16 – 16-bit signed integer
139
- I: :uint, # 32-bit unsigned integer
140
- i: :int, # 32-bit signed integer
141
- # :uint32 – 32-bit unsigned integer
142
- # :int32 – 32-bit signed integer
143
- L: :ulong, # unsigned long int – platform-specific size
144
- l: :long, # long int – platform-specific size (http://groups.google.com/group/ruby-ffi/browse_thread/thread/4762fc77130339b1)
145
- # :int64 – 64-bit signed integer
146
- # :uint64 – 64-bit unsigned integer
147
- # :long_long – 64-bit signed integer
148
- # :ulong_long – 64-bit unsigned integer
149
- F: :float, # 32-bit floating point
150
- D: :double, # 64-bit floating point (double-precision)
151
- P: :pointer, # pointer – platform-specific size
152
- p: :string, # C-style (NULL-terminated) character string (Win32API: S)
153
- B: :bool # (?? 1 byte in C++)
154
- #For function argument type only:
155
- # :buffer_in – Similar to :pointer, but optimized for Buffers that the function can only read (not write).
156
- # :buffer_out – Similar to :pointer, but optimized for Buffers that the function can only write (not read).
157
- # :buffer_inout – Similar to :pointer, but may be optimized for Buffers.
158
- # :varargs – Variable arguments
159
- }
1
+ == Parameters ( win32-api )
2
+ Long: 'L'
3
+ Integer: 'I'
4
+ Pointer: 'P'
5
+ Void: 'V'
6
+ String: 'S'
7
+ Callback: 'K' # win32-api only
8
+
9
+ == Windows Data Types
10
+ BOOL => 'I' (or 'B', win32-api only)
11
+ DWORD => 'L'
12
+ HANDLE => 'L'
13
+ LPDWORD => 'P' (or 'L')
14
+ LPTSTR => 'P'
15
+ LPCTSTR => 'S'
16
+ UINT => 'L'
17
+ VOID => 'V'
18
+ WORD => 'I'
19
+ LPVOID => 'L' (or 'P')
20
+ CALLBACK => 'K'
21
+
22
+ == C Data Types
23
+ void => 'V'
24
+ void* => 'P'
25
+ char* => 'P'
26
+ const char* => 'L'
27
+ int => 'I'
28
+ long => 'L'
29
+ struct => 'P'
30
+ struct* => 'P'
31
+
32
+ == Notes
33
+ In practice most LPVOID types should be designated as 'L' because this
34
+ usually means the function is looking for an address. Check the documentation
35
+ for details.
36
+
37
+ If using the windows-api library, you can use 'B' instead of 'I' for the return
38
+ type for functions that return a BOOL.
39
+
40
+ ===== Definitions from windows-api (api.rb)
41
+ # Verbose data types that can be used instead of single letters
42
+ DATA_TYPES = {
43
+ 'ATOM' => 'I',
44
+ 'BOOL' => 'B',
45
+ 'BOOLEAN' => 'B',
46
+ 'BYTE' => 'I',
47
+ 'CALLBACK' => 'K',
48
+ 'CHAR' => 'I',
49
+ 'COLORREF' => 'L',
50
+ 'DWORD' => 'L',
51
+ 'DWORDLONG' => 'L',
52
+ 'DWORD_PTR' => 'P',
53
+ 'DWORD32' => 'I',
54
+ 'DWORD64' => 'L',
55
+ 'HACCEL' => 'L',
56
+ 'HANDLE' => 'L',
57
+ 'HBITMAP' => 'L',
58
+ 'HBRUSH' => 'L',
59
+ 'HCOLORSPACE' => 'L',
60
+ 'HCONV' => 'L',
61
+ 'HDC' => 'L',
62
+ 'HFILE' => 'I',
63
+ 'HKEY' => 'L',
64
+ 'HFONT' => 'L',
65
+ 'HINSTANCE' => 'L',
66
+ 'HKEY' => 'L',
67
+ 'HLOCAL' => 'L',
68
+ 'HMENU' => 'L',
69
+ 'HMODULE' => 'L',
70
+ 'HRESULT' => 'L',
71
+ 'HWND' => 'L',
72
+ 'INT' => 'I',
73
+ 'INT_PTR' => 'P',
74
+ 'INT32' => 'I',
75
+ 'INT64' => 'L',
76
+ 'LANGID' => 'I',
77
+ 'LCID' => 'L',
78
+ 'LCTYPE' => 'L',
79
+ 'LONG' => 'L',
80
+ 'LONGLONG' => 'L',
81
+ 'LONG_PTR' => 'P',
82
+ 'LONG32' => 'L',
83
+ 'LONG64' => 'L',
84
+ 'LPARAM' => 'P',
85
+ 'LPBOOL' => 'P',
86
+ 'LPBYTE' => 'P',
87
+ 'LPCOLORREF' => 'P',
88
+ 'LPCSTR' => 'P',
89
+ 'LPCTSTR' => 'P',
90
+ 'LPCVOID' => 'L',
91
+ 'LPCWSTR' => 'P',
92
+ 'LPDWORD' => 'P',
93
+ 'LPHANDLE' => 'P',
94
+ 'LPINT' => 'P',
95
+ 'LPLONG' => 'P',
96
+ 'LPSTR' => 'P',
97
+ 'LPTSTR' => 'P',
98
+ 'LPVOID' => 'L',
99
+ 'LPWORD' => 'P',
100
+ 'LPWSTR' => 'P',
101
+ 'LRESULT' => 'P',
102
+ 'PBOOL' => 'P',
103
+ 'PBOOLEAN' => 'P',
104
+ 'PBYTE' => 'P',
105
+ 'PHKEY' => 'P',
106
+ 'SC_HANDLE' => 'L',
107
+ 'SC_LOCK' => 'L',
108
+ 'SERVICE_STATUS_HANDLE' => 'L',
109
+ 'SHORT' => 'I',
110
+ 'SIZE_T' => 'P',
111
+ 'TCHAR' => 'L',
112
+ 'UINT' => 'I',
113
+ 'UINT_PTR' => 'P',
114
+ 'UINT32' => 'I',
115
+ 'UINT64' => 'L',
116
+ 'ULONG' => 'L',
117
+ 'ULONGLONG' => 'L',
118
+ 'ULONG_PTR' => 'P',
119
+ 'ULONG32' => 'L',
120
+ 'ULONG64' => 'L',
121
+ 'USHORT' => 'I',
122
+ 'USN' => 'L',
123
+ 'WINAPI' => 'L',
124
+ 'WORD' => 'I'
125
+ }
126
+
127
+ Win::Library shortcuts (Mostly in line with Array#pack)
128
+ TYPES = {
129
+ V: :void, # For functions that return nothing (return type void).
130
+ v: :void, # For functions that return nothing (return type void).
131
+ C: :uchar, #– 8-bit unsigned character (byte)
132
+ c: :char, # 8-bit character (byte)
133
+ # :int8 – 8-bit signed integer
134
+ # :uint8 – 8-bit unsigned integer
135
+ S: :ushort, # – 16-bit unsigned integer (Win32API: used for string)
136
+ s: :short, # – 16-bit signed integer
137
+ # :uint16 – 16-bit unsigned integer
138
+ # :int16 – 16-bit signed integer
139
+ I: :uint, # 32-bit unsigned integer
140
+ i: :int, # 32-bit signed integer
141
+ # :uint32 – 32-bit unsigned integer
142
+ # :int32 – 32-bit signed integer
143
+ L: :ulong, # unsigned long int – platform-specific size
144
+ l: :long, # long int – platform-specific size (http://groups.google.com/group/ruby-ffi/browse_thread/thread/4762fc77130339b1)
145
+ # :int64 – 64-bit signed integer
146
+ # :uint64 – 64-bit unsigned integer
147
+ # :long_long – 64-bit signed integer
148
+ # :ulong_long – 64-bit unsigned integer
149
+ F: :float, # 32-bit floating point
150
+ D: :double, # 64-bit floating point (double-precision)
151
+ P: :pointer, # pointer – platform-specific size
152
+ p: :string, # C-style (NULL-terminated) character string (Win32API: S)
153
+ B: :bool # (?? 1 byte in C++)
154
+ #For function argument type only:
155
+ # :buffer_in – Similar to :pointer, but optimized for Buffers that the function can only read (not write).
156
+ # :buffer_out – Similar to :pointer, but optimized for Buffers that the function can only write (not read).
157
+ # :buffer_inout – Similar to :pointer, but may be optimized for Buffers.
158
+ # :varargs – Variable arguments
159
+ }
@@ -1,44 +1,44 @@
1
- # Quick and dirty DDE Client (for experimentation)
2
-
3
- require 'win/gui/message'
4
- include Win::GUI::Message
5
-
6
- #require_relative 'exp_lib'
7
- #include DDELib
8
-
9
- require 'win/dde'
10
- include Win::DDE
11
-
12
- calls = []
13
- buffer = FFI::MemoryPointer.new(:long).write_long(0)
14
- buffer.address
15
-
16
- callback = lambda do |*args|
17
- calls << [*args]
18
- DDE_FACK
19
- end
20
-
21
- p status = DdeInitialize(buffer, callback, APPCLASS_STANDARD, 0)
22
- p id = buffer.read_long
23
-
24
- service = FFI::MemoryPointer.from_string('test_service')
25
-
26
- p handle = DdeCreateStringHandle(id, service, CP_WINANSI)
27
-
28
- p conv_handle = DdeConnect(id, handle, handle, nil)
29
-
30
- str = FFI::MemoryPointer.from_string("Poke_string\n\x00\x00")
31
-
32
- p DdeClientTransaction(str, str.size, conv_handle, handle, CF_TEXT, XTYP_POKE, 1000, nil)
33
- p Win::DDE::ERRORS[DdeGetLastError(id)]
34
- p DdeClientTransaction(str, str.size, conv_handle, handle, CF_TEXT, XTYP_EXECUTE, 1000, nil)
35
- p Win::DDE::ERRORS[DdeGetLastError(id)]
36
- sleep 0.01
37
- p DdeClientTransaction(str, str.size, conv_handle, handle, CF_TEXT, XTYP_EXECUTE, TIMEOUT_ASYNC, nil)
38
- p Win::DDE::ERRORS[DdeGetLastError(id)]
39
-
40
- p DdeDisconnect(conv_handle)
41
-
42
- p calls.map{|c| c.map{|e|e.respond_to?(:address) ? e.address : (Win::DDE::TYPES[e] || e)}}
43
-
44
- p Win::DDE::ERRORS[DdeGetLastError(id)]
1
+ # Quick and dirty DDE Client (for experimentation)
2
+
3
+ require 'win/gui/message'
4
+ include Win::GUI::Message
5
+
6
+ #require_relative 'exp_lib'
7
+ #include DDELib
8
+
9
+ require 'win/dde'
10
+ include Win::Dde
11
+
12
+ calls = []
13
+ buffer = FFI::MemoryPointer.new(:long).write_long(0)
14
+ buffer.address
15
+
16
+ callback = lambda do |*args|
17
+ calls << [*args]
18
+ DDE_FACK
19
+ end
20
+
21
+ p status = DdeInitialize(buffer, callback, APPCLASS_STANDARD, 0)
22
+ p id = buffer.read_long
23
+
24
+ service = FFI::MemoryPointer.from_string('test_service')
25
+
26
+ p handle = DdeCreateStringHandle(id, service, CP_WINANSI)
27
+
28
+ p conv_handle = DdeConnect(id, handle, handle, nil)
29
+
30
+ str = FFI::MemoryPointer.from_string("Poke_string\n\x00\x00")
31
+
32
+ p DdeClientTransaction(str, str.size, conv_handle, handle, CF_TEXT, XTYP_POKE, 1000, nil)
33
+ p Win::Dde::ERRORS[DdeGetLastError(id)]
34
+ p DdeClientTransaction(str, str.size, conv_handle, handle, CF_TEXT, XTYP_EXECUTE, 1000, nil)
35
+ p Win::Dde::ERRORS[DdeGetLastError(id)]
36
+ sleep 0.01
37
+ p DdeClientTransaction(str, str.size, conv_handle, handle, CF_TEXT, XTYP_EXECUTE, TIMEOUT_ASYNC, nil)
38
+ p Win::Dde::ERRORS[DdeGetLastError(id)]
39
+
40
+ p DdeDisconnect(conv_handle)
41
+
42
+ p calls.map{|c| c.map{|e|e.respond_to?(:address) ? e.address : (Win::Dde::TYPES[e] || e)}}
43
+
44
+ p Win::Dde::ERRORS[DdeGetLastError(id)]
@@ -1,18 +1,18 @@
1
- # Objective DDE Server (for experimentation)
2
-
3
- require 'win/gui/message'
4
- include Win::GUI::Message
5
-
6
- require 'dde'
7
- include Win::DDE
8
-
9
- calls = []
10
- $monitor = DDE::Monitor.new
11
- msg = Msg.new # pointer to Msg FFI struct
12
-
13
- # Starting message loop (necessary for DDE processing)
14
- puts "Starting message loop\n"
15
- while msg = get_message()
16
- translate_message(msg)
17
- dispatch_message(msg)
18
- end
1
+ # Objective DDE Server (for experimentation)
2
+
3
+ require 'win/gui/message'
4
+ include Win::GUI::Message
5
+
6
+ require 'dde'
7
+ include Win::Dde
8
+
9
+ calls = []
10
+ $monitor = Dde::Monitor.new
11
+ msg = Msg.new # pointer to Msg FFI struct
12
+
13
+ # Starting message loop (necessary for DDE processing)
14
+ puts "Starting message loop\n"
15
+ while msg = get_message()
16
+ translate_message(msg)
17
+ dispatch_message(msg)
18
+ end
@@ -1,36 +1,36 @@
1
- # Objective DDE Server (for experimentation)
2
-
3
- require 'win/gui/message'
4
- include Win::GUI::Message
5
-
6
- require 'dde'
7
- include Win::DDE
8
-
9
- calls = []
10
- @server = DDE::Server.new do |*args|
11
- calls << extract_values(*args) #[Win::DDE::TYPES[args.shift]]+args; 1}
12
- puts "#{Time.now.strftime('%T.%6N')} #{extract_values(*args)}"
13
- args.first == XTYP_CONNECT ? 1 : DDE_FACK
14
- end
15
- sleep 0.05
16
- @server.start_service('test_service')
17
-
18
- def extract_values(type, format, conv, hsz1, hsz2, data, data1, data2)
19
- [Win::DDE::TYPES[type], format, conv,
20
- dde_query_string(@server.id, hsz1),
21
- dde_query_string(@server.id, hsz2),
22
- data, data1, data2]
23
- end
24
-
25
- msg = Msg.new # pointer to Msg FFI struct
26
-
27
- # Starting message loop (necessary for DDE processing)
28
- puts "Starting message loop\n"
29
- while msg = get_message()
30
- translate_message(msg)
31
- dispatch_message(msg)
32
- end
33
-
34
- p calls.map{|c| c.map{|e|e.respond_to?(:address) ? e.address : (Win::DDE::TYPES[e] || e)}}
35
-
36
- p Win::DDE::ERRORS[DdeGetLastError(@server.id)]
1
+ # Objective DDE Server (for experimentation)
2
+
3
+ require 'win/gui/message'
4
+ include Win::GUI::Message
5
+
6
+ require 'dde'
7
+ include Win::Dde
8
+
9
+ calls = []
10
+ @server = Dde::Server.new do |*args|
11
+ calls << extract_values(*args) #[Win::Dde::TYPES[args.shift]]+args; 1}
12
+ puts "#{Time.now.strftime('%T.%6N')} #{extract_values(*args)}"
13
+ args.first == XTYP_CONNECT ? 1 : DDE_FACK
14
+ end
15
+ sleep 0.05
16
+ @server.start_service('test_service')
17
+
18
+ def extract_values(type, format, conv, hsz1, hsz2, data, data1, data2)
19
+ [Win::Dde::TYPES[type], format, conv,
20
+ dde_query_string(@server.id, hsz1),
21
+ dde_query_string(@server.id, hsz2),
22
+ data, data1, data2]
23
+ end
24
+
25
+ msg = Msg.new # pointer to Msg FFI struct
26
+
27
+ # Starting message loop (necessary for DDE processing)
28
+ puts "Starting message loop\n"
29
+ while msg = get_message()
30
+ translate_message(msg)
31
+ dispatch_message(msg)
32
+ end
33
+
34
+ p calls.map{|c| c.map{|e|e.respond_to?(:address) ? e.address : (Win::Dde::TYPES[e] || e)}}
35
+
36
+ p Win::Dde::ERRORS[DdeGetLastError(@server.id)]