Hi,
Sorry for the delay.
Here is a test, pls import the attached registry files, and copy
native activeds.dll, adsldpc.dll,
adsldp.dll to your windows system32 dir, and patch
wine/dlls/ole32/tests/moniker.c
Then run the test:
$ ../../../wine ole32_test.exe.so moniker
err:ole:apartment_getclassobject DllGetClassObject returned error 0x80004002
err:ole:create_server class {228d9a81-c302-11cf-9aa4-00aa004a5691} not
registered
fixme:ole:CoGetClassObject CLSCTX_REMOTE_SERVER not supported
err:ole:CoGetClassObject no class object
{228d9a81-c302-11cf-9aa4-00aa004a5691} could be created for context
0x15
moniker.c:783: Test failed: ****************LDAP**************
moniker: 2 tests executed (0 marked as todo, 1 failure), 0 skipped.
after my patch:
$ ../../../wine ole32_test.exe.so moniker
moniker.c:783: Test failed: ****************LDAP**************
moniker: 2 tests executed (0 marked as todo, 1 failure), 0 skipped.
Although the test failed, but loading class
{228d9a81-c302-11cf-9aa4-00aa004a5691} success.
Post by Robert ShearmanSee dlls/ole32/compobj.c,
static HRESULT apartment_getclassobject(struct apartment *apt, LPCWSTR dllpath,
BOOL apartment_threaded,
REFCLSID rclsid, REFIID riid,
void **ppv)
{
...................
if (SUCCEEDED(hr))
{
..................
TRACE("calling DllGetClassObject %p\n",
apartment_loaded_dll->dll->DllGetClassObject);
/* OK: get the ClassObject */
hr = apartment_loaded_dll->dll->DllGetClassObject(rclsid, riid, ppv);
^^^^
if (hr != S_OK)
ERR("DllGetClassObject returned error 0x%08x\n", hr);
}
..............
}
Reference to http://msdn2.microsoft.com/en-us/library/ms680760.aspx,
riid
[in] Reference to the identifier of the interface that the caller
is to use to communicate with the class object. Usually, this is
IID_IClassFactory (defined in the OLE headers as the interface
identifier for IClassFactory).
This doesn't mean anything other than CoCreateInstance is usually used
instead of CoGetClassObject (and CoCreateInstance always passes in
IID_IClassFactory for the IID).
It's failed when calling MkParseDisplayName.
Post by Robert ShearmanWe can't pass riid to DllGetClassObject directly sometimes, causes some dlls'
DllGetClassObject (like native adsldp.dll) can only return reference-counted
pointer to class factory via IID_IClassFactory, for retrieving the
pointer to the
class object interface requested in riid, we must try another way.
Thank you for your patch, but this behaviour seems a little strange and
needs a little more investigation before I am happy that it is correct.
What parameters are being passed in to CoGetClassObject to cause the
call to fail for you?
That's how MS does, I see this strange behaviour happening through
assembly debugging.
First time calling DllGetClassObject using riid, and it's failed, then
trying IID_IClassFactory.
Anyway, what's DllGetClassObject return depends on its implementation,
it can be a pointer to
ClassFactory or a pointer to class object, we should try both.
--
$ apt-get moo
(__)
(oo)
/------\/
/ | ||
* /\---/\
~~ ~~
...."Have you mooed today?"...