117
117
#define WC2VSTR(x) ole_wc2vstr((x), TRUE)
119
#define WIN32OLE_VERSION "1.0.2"
119
#define WIN32OLE_VERSION "1.0.7"
121
121
typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX)
122
122
(REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*);
771
769
size = WideCharToMultiByte(cWIN32OLE_cp, 0, pw, -1, NULL, 0, NULL, NULL);
773
pm = ALLOC_N(char, size);
771
pm = ALLOC_N(char, size + 1);
774
772
WideCharToMultiByte(cWIN32OLE_cp, 0, pw, -1, pm, size, NULL, NULL);
777
776
pm = ALLOC_N(char, 1);
1076
1075
val1 = ole_ary_m_entry(val, pid);
1077
1076
p = val2variant_ptr(val1, &var, vt);
1078
1077
if (is_all_index_under(pid, pub, dim) == Qtrue) {
1079
if (V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == NULL ||
1080
V_VT(&var) == VT_UNKNOWN && V_UNKNOWN(&var) == NULL) {
1078
if ((V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == NULL) ||
1079
(V_VT(&var) == VT_UNKNOWN && V_UNKNOWN(&var) == NULL)) {
1081
1080
rb_raise(eWIN32OLERuntimeError, "argument does not have IDispatch or IUnknown Interface");
1083
1082
hr = SafeArrayPutElement(psa, pid, p);
1916
1915
reg_enum_key(HKEY hkey, DWORD i)
1917
char buf[BUFSIZ + 1];
1919
1918
DWORD size_buf = sizeof(buf);
1921
1920
LONG err = RegEnumKeyEx(hkey, i, buf, &size_buf,
1922
1921
NULL, NULL, NULL, &ft);
1923
1922
if(err == ERROR_SUCCESS) {
1924
1924
return rb_str_new2(buf);
1930
1930
reg_get_val(HKEY hkey, const char *subkey)
1933
LONG size_buf = sizeof(buf);
1934
LONG err = RegQueryValue(hkey, subkey, buf, &size_buf);
1935
if (err == ERROR_SUCCESS) {
1936
return rb_str_new2(buf);
1936
LONG err = RegQueryValueEx(hkey, subkey, NULL, &dwtype, NULL, &size);
1938
if (err == ERROR_SUCCESS) {
1939
pbuf = ALLOC_N(char, size + 1);
1940
err = RegQueryValueEx(hkey, subkey, NULL, &dwtype, pbuf, &size);
1941
if (err == ERROR_SUCCESS) {
1943
val = rb_str_new2(pbuf);
1951
reg_get_val2(HKEY hkey, const char *subkey)
1956
err = RegOpenKeyEx(hkey, subkey, 0, KEY_READ, &hsubkey);
1957
if (err == ERROR_SUCCESS) {
1958
val = reg_get_val(hsubkey, NULL);
1959
RegCloseKey(hsubkey);
1962
val = reg_get_val(hkey, subkey);
1942
1968
reg_get_typelib_file_path(HKEY hkey)
1944
1970
VALUE path = Qnil;
1945
path = reg_get_val(hkey, "win32");
1971
path = reg_get_val2(hkey, "win32");
1946
1972
if (path == Qnil) {
1947
path = reg_get_val(hkey, "win16");
1973
path = reg_get_val2(hkey, "win16");
1953
1979
typelib_file_from_clsid(VALUE ole)
1958
1981
HKEY hroot, hclsid;
1984
char path[MAX_PATH + 1];
1963
pbuf = ole_mb2wc(StringValuePtr(ole), -1);
1964
hr = CLSIDFromProgID(pbuf, &clsid);
1965
SysFreeString(pbuf);
1969
StringFromCLSID(&clsid, &pbuf);
1970
vclsid = WC2VSTR(pbuf);
1971
1986
err = reg_open_key(HKEY_CLASSES_ROOT, "CLSID", &hroot);
1972
1987
if (err != ERROR_SUCCESS) {
1975
err = reg_open_key(hroot, StringValuePtr(vclsid), &hclsid);
1990
err = reg_open_key(hroot, StringValuePtr(ole), &hclsid);
1976
1991
if (err != ERROR_SUCCESS) {
1977
1992
RegCloseKey(hroot);
1980
typelib = reg_get_val(hclsid, "InprocServer32");
1995
typelib = reg_get_val2(hclsid, "InprocServer32");
1981
1996
RegCloseKey(hroot);
1982
1997
RegCloseKey(hclsid);
1998
if (typelib != Qnil) {
1999
ExpandEnvironmentStrings(StringValuePtr(typelib), path, sizeof(path));
2000
path[MAX_PATH] = '\0';
2001
typelib = rb_str_new2(path);
1983
2003
return typelib;
2014
2034
if (ver == Qnil)
2016
2036
err = reg_open_vkey(hclsid, ver, &hversion);
2017
if (err != ERROR_SUCCESS || fver > atof(StringValuePtr(ver)))
2037
if (err != ERROR_SUCCESS || fver > atof(StringValuePtr(ver)))
2019
2039
fver = atof(StringValuePtr(ver));
2020
2040
typelib = reg_get_val(hversion, NULL);
2641
2661
lcid_installed(LCID lcid)
2643
2663
g_lcid_installed = FALSE;
2644
snprintf(g_lcid_to_check, sizeof(g_lcid_to_check), "%08x", lcid);
2664
snprintf(g_lcid_to_check, sizeof(g_lcid_to_check), "%08lx", lcid);
2645
2665
EnumSystemLocales(installed_lcid_proc, LCID_INSTALLED);
2646
2666
return g_lcid_installed;
4428
4448
err = reg_open_vkey(hclsids, clsid, &hclsid);
4429
4449
if (err != ERROR_SUCCESS)
4431
if ((v = reg_get_val(hclsid, "ProgID")) != Qnil)
4451
if ((v = reg_get_val2(hclsid, "ProgID")) != Qnil)
4432
4452
rb_ary_push(progids, v);
4433
if ((v = reg_get_val(hclsid, "VersionIndependentProgID")) != Qnil)
4453
if ((v = reg_get_val2(hclsid, "VersionIndependentProgID")) != Qnil)
4434
4454
rb_ary_push(progids, v);
4435
4455
RegCloseKey(hclsid);
4545
4565
version = reg_enum_key(hguid, j);
4546
4566
if (version == Qnil)
4548
if ( (name = reg_get_val(hguid, StringValuePtr(version))) != Qnil ) {
4568
if ( (name = reg_get_val2(hguid, StringValuePtr(version))) != Qnil ) {
4549
4569
typelib = rb_funcall(cWIN32OLE_TYPELIB, rb_intern("allocate"), 0);
4550
4570
oletypelib_set_member(typelib, name, guid, version);
4551
4571
rb_ary_push(typelibs, typelib);
5172
5192
if (FAILED(hr))
5174
5194
hr = ProgIDFromCLSID(&pTypeAttr->guid, &pbuf);
5176
progid = WC2VSTR(pbuf);
5195
if (SUCCEEDED(hr)) {
5196
progid = ole_wc2vstr(pbuf, FALSE);
5197
CoTaskMemFree(pbuf);
5177
5199
OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
7342
7362
ITypeInfo *pti = NULL;
7343
7363
IConnectionPoint *pcp = NULL;
7345
if (poleev->freed == 1) {
7347
* this return create memory leak.
7348
* but poleev->pEvent->pConnectionPoint shoul'd not be freed
7349
* until poleev->freed == 0.
7353
if(poleev->pEvent) {
7354
pti = poleev->pEvent->pTypeInfo;
7355
if(pti) OLE_RELEASE(pti);
7356
pcp = poleev->pEvent->pConnectionPoint;
7358
pcp->lpVtbl->Unadvise(pcp, poleev->pEvent->m_dwCookie);
7453
7457
Data_Get_Struct(self, struct oleeventdata, poleev);
7454
poleev->pEvent = pIEV;
7455
poleev->pEvent->m_event_id
7456
7459
= NUM2INT(rb_funcall(ary_ole_event, rb_intern("length"), 0));
7457
poleev->pEvent->pConnectionPoint = pConnectionPoint;
7458
poleev->pEvent->pTypeInfo = pTypeInfo;
7459
poleev->pEvent->m_dwCookie = dwCookie;
7461
poleev->pEvent->ptr_freed = &(poleev->freed);
7460
pIEV->pConnectionPoint = pConnectionPoint;
7461
pIEV->pTypeInfo = pTypeInfo;
7462
pIEV->m_dwCookie = dwCookie;
7462
7464
rb_ary_push(ary_ole_event, self);
7464
7466
events = rb_ary_new();
7849
7850
VariantInit(&var);
7850
7851
vt = (V_VT(&(pvar->var)) & ~VT_ARRAY);
7851
7852
p = val2variant_ptr(argv[argc-1], &var, vt);
7852
if (V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == NULL ||
7853
V_VT(&var) == VT_UNKNOWN && V_UNKNOWN(&var) == NULL) {
7853
if ((V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == NULL) ||
7854
(V_VT(&var) == VT_UNKNOWN && V_UNKNOWN(&var) == NULL)) {
7854
7855
rb_raise(eWIN32OLERuntimeError, "argument does not have IDispatch or IUnknown Interface");
7856
7857
hr = SafeArrayPutElement(psa, pid, p);