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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#include "win32ole.h"
static VALUE ole_hresult2msg(HRESULT hr);
static VALUE
ole_hresult2msg(HRESULT hr)
{
VALUE msg = Qnil;
char *p_msg = NULL;
char *term = NULL;
DWORD dwCount;
char strhr[100];
sprintf(strhr, " HRESULT error code:0x%08x\n ", (unsigned)hr);
msg = rb_str_new2(strhr);
dwCount = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, hr,
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(LPTSTR)&p_msg, 0, NULL);
if (dwCount == 0) {
dwCount = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, hr, cWIN32OLE_lcid,
(LPTSTR)&p_msg, 0, NULL);
}
if (dwCount > 0) {
term = p_msg + strlen(p_msg);
while (p_msg < term) {
term--;
if (*term == '\r' || *term == '\n')
*term = '\0';
else break;
}
if (p_msg[0] != '\0') {
rb_str_cat2(msg, p_msg);
}
}
LocalFree(p_msg);
return msg;
}
void
ole_raise(HRESULT hr, VALUE ecs, const char *fmt, ...)
{
va_list args;
VALUE msg;
VALUE err_msg;
va_init_list(args, fmt);
msg = rb_vsprintf(fmt, args);
va_end(args);
err_msg = ole_hresult2msg(hr);
if(err_msg != Qnil) {
rb_str_cat2(msg, "\n");
rb_str_append(msg, err_msg);
}
rb_exc_raise(rb_exc_new_str(ecs, msg));
}
void
Init_win32ole_error(void)
{
/*
* Document-class: WIN32OLERuntimeError
*
* Raised when OLE processing failed.
*
* EX:
*
* obj = WIN32OLE.new("NonExistProgID")
*
* raises the exception:
*
* WIN32OLERuntimeError: unknown OLE server: `NonExistProgID'
* HRESULT error code:0x800401f3
* Invalid class string
*
*/
eWIN32OLERuntimeError = rb_define_class("WIN32OLERuntimeError", rb_eRuntimeError);
}
|