Feature #13828 » licensed_com.patch
| ext/win32ole/win32ole.c | ||
|---|---|---|
|
return Qnil;
|
||
|
}
|
||
|
#define OPTHASH_GIVEN_P(opts) \
|
||
|
(argc > 0 && !NIL_P((opts) = rb_check_hash_type(argv[argc-1])) && (--argc, 1))
|
||
|
/*
|
||
|
* Document-class: WIN32OLE
|
||
|
*
|
||
| ... | ... | |
|
/*
|
||
|
* call-seq:
|
||
|
* WIN32OLE.new(server, [host]) -> WIN32OLE object
|
||
|
* WIN32OLE.new(server, nil, license: 'key') -> WIN32OLE object
|
||
|
*
|
||
|
* Returns a new WIN32OLE object(OLE Automation object).
|
||
|
* The first argument server specifies OLE Automation server.
|
||
| ... | ... | |
|
* If second argument host specified, then returns OLE Automation
|
||
|
* object on host.
|
||
|
*
|
||
|
* If :license keyword argument is provided,
|
||
|
* IClassFactory2::CreateInstanceLic is used to create instance of
|
||
|
* licensed server.
|
||
|
*
|
||
|
* WIN32OLE.new('Excel.Application') # => Excel OLE Automation WIN32OLE object.
|
||
|
* WIN32OLE.new('{00024500-0000-0000-C000-000000000046}') # => Excel OLE Automation WIN32OLE object.
|
||
|
*/
|
||
| ... | ... | |
|
VALUE svr_name;
|
||
|
VALUE host;
|
||
|
VALUE others;
|
||
|
VALUE hash;
|
||
|
HRESULT hr;
|
||
|
CLSID clsid;
|
||
|
OLECHAR *pBuf;
|
||
|
OLECHAR *key_buf;
|
||
|
IDispatch *pDispatch;
|
||
|
IClassFactory2 * class_factory;
|
||
|
void *p;
|
||
|
static ID kwargs_ids[1];
|
||
|
VALUE kwargs[1];
|
||
|
rb_call_super(0, 0);
|
||
|
rb_scan_args(argc, argv, "11*", &svr_name, &host, &others);
|
||
|
rb_scan_args(argc, argv, "11*:", &svr_name, &host, &others, &hash);
|
||
|
StringValue(svr_name);
|
||
|
if (rb_safe_level() > 0 && OBJ_TAINTED(svr_name)) {
|
||
| ... | ... | |
|
StringValuePtr(svr_name));
|
||
|
}
|
||
|
/* get IDispatch interface */
|
||
|
hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
|
||
|
&IID_IDispatch, &p);
|
||
|
if (!kwargs_ids[0]) {
|
||
|
kwargs_ids[0] = rb_intern_const("license");
|
||
|
}
|
||
|
rb_get_kwargs(hash, kwargs_ids, 0, 1, kwargs);
|
||
|
if (kwargs[0] == Qundef) {
|
||
|
/* get IDispatch interface */
|
||
|
hr = CoCreateInstance(
|
||
|
&clsid,
|
||
|
NULL,
|
||
|
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
|
||
|
&IID_IDispatch,
|
||
|
&p
|
||
|
);
|
||
|
} else {
|
||
|
hr = CoGetClassObject(
|
||
|
&clsid,
|
||
|
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
|
||
|
NULL,
|
||
|
&IID_IClassFactory2,
|
||
|
(LPVOID)&class_factory
|
||
|
);
|
||
|
if (hr == S_OK) {
|
||
|
key_buf = ole_vstr2wc(kwargs[0]);
|
||
|
hr = class_factory->lpVtbl->CreateInstanceLic(class_factory, NULL, NULL, &IID_IDispatch, key_buf, &p);
|
||
|
SysFreeString(key_buf);
|
||
|
class_factory->lpVtbl->Release(class_factory);
|
||
|
}
|
||
|
}
|
||
|
pDispatch = p;
|
||
|
if(FAILED(hr)) {
|
||
|
ole_raise(hr, eWIN32OLERuntimeError,
|
||
| ... | ... | |
|
ole_init_cp();
|
||
|
}
|
||
|
/* vim: set ts=8 sw=4 noexpandtab: */
|
||
- « Previous
- 1
- 2
- 3
- Next »