ole32: Get the threading model value for inproc classes and output a

fixme if we should create it in an apartment of another type.
This commit is contained in:
Robert Shearman 2006-08-26 11:41:42 +01:00 committed by Alexandre Julliard
parent 9959d7e37f
commit c1eb2c7003

View file

@ -1627,14 +1627,59 @@ static DWORD COM_RegReadPath(HKEY hkeyroot, const WCHAR *keyname, const WCHAR *v
return ret;
}
static void get_threading_model(HKEY key, LPWSTR value, DWORD len)
{
static const WCHAR wszThreadingModel[] = {'T','h','r','e','a','d','i','n','g','M','o','d','e','l',0};
DWORD keytype;
DWORD ret;
DWORD dwLength = len * sizeof(WCHAR);
ret = RegQueryValueExW(key, wszThreadingModel, NULL, &keytype, (LPBYTE)value, &dwLength);
if ((ret != ERROR_SUCCESS) || (keytype != REG_SZ))
value[0] = '\0';
}
static HRESULT get_inproc_class_object(HKEY hkeydll, REFCLSID rclsid, REFIID riid, void **ppv)
{
static const WCHAR wszApartment[] = {'A','p','a','r','t','m','e','n','t',0};
static const WCHAR wszFree[] = {'F','r','e','e',0};
static const WCHAR wszBoth[] = {'B','o','t','h',0};
HINSTANCE hLibrary;
typedef HRESULT (CALLBACK *DllGetClassObjectFunc)(REFCLSID clsid, REFIID iid, LPVOID *ppv);
DllGetClassObjectFunc DllGetClassObject;
WCHAR dllpath[MAX_PATH+1];
WCHAR threading_model[10 /* strlenW(L"apartment")+1 */];
HRESULT hr;
get_threading_model(hkeydll, threading_model, ARRAYSIZE(threading_model));
/* "Apartment" */
if (!strcmpiW(threading_model, wszApartment))
{
APARTMENT *apt = COM_CurrentApt();
if (apt->multi_threaded)
{
FIXME("should create object %s in single-threaded apartment\n",
debugstr_guid(rclsid));
}
}
/* "Free" */
else if (!strcmpiW(threading_model, wszFree))
{
APARTMENT *apt = COM_CurrentApt();
if (!apt->multi_threaded)
{
FIXME("should create object %s in multi-threaded apartment\n",
debugstr_guid(rclsid));
}
}
/* everything except "Apartment", "Free" and "Both" */
else if (strcmpiW(threading_model, wszBoth))
{
/* everything else is main-threaded */
FIXME("unrecognised threading model %s for object %s, should be main-threaded?\n",
debugstr_w(threading_model), debugstr_guid(rclsid));
}
if (COM_RegReadPath(hkeydll, NULL, NULL, dllpath, ARRAYSIZE(dllpath)) != ERROR_SUCCESS)
{
/* failure: CLSID is not found in registry */