Project

General

Profile

Feature #13828 » licensed_com.patch

Original version - graywolf (Gray Wolf), 08/18/2017 10:36 PM

View differences:

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.
*/
......
StringValuePtr(svr_name));
}
/* get IDispatch interface */
hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
&IID_IDispatch, &p);
VALUE license_key = Qnil;
if (OPTHASH_GIVEN_P(others)) {
license_key = rb_hash_lookup(others, ID2SYM(rb_intern("license")));
}
if (license_key == Qnil) {
/* get IDispatch interface */
hr = CoCreateInstance(
&clsid,
NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
&IID_IDispatch,
&p
);
} else {
IClassFactory2 * class_factory;
hr = CoGetClassObject(
&clsid,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
NULL,
&IID_IClassFactory2,
(LPVOID)&class_factory
);
if (hr == S_OK) {
OLECHAR * key_buf = ole_vstr2wc(license_key);
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 */
(1-1/3)