If you've ever developed a COM DLL in C++/ATL for VBA (VB6.0, Access, Excel, blah blah blah) then you know that if you want to get error information via Err.Message you need to set IErrorInfo, derived from ISupportsErrorInfo, IDispatch and so on...

I did this. And it works. That is, it works if I early bind the object, the error messages come back to the VB client with no hassles. However, if I change it to late bind the object it fails to return a proper error message (the HRESULT code is right, just not the message). In fact it just returns with Method 'mymethod' of Object 'myobject' failed. Not exactly descriptive. Has anyone else run into this? Has anyone figured out why it does this? And most importantly has anyone managed to correct this? I've googled to holy hell and back and I keep finding the same implementation for IErrorInfo that I use already, so it's of little help.

I know there has to be a way, a lot of other COM dlls I've tried in the past are more than able to return their error messages no matter if they're late bound or early bound.

The object definition is as follows:
Code:
// ISoap
[
	object,
	uuid("702C976C-849B-4846-8346-89451DD2C9B5"),
	dual,
	oleautomation,	
	helpstring("Main interface for SOAP."),
	pointer_default(unique)
]
__interface ISoap : IDispatch
{	
   // ... Methods, properties, oh my....
};


// CSoap
[
	coclass,
	threading("apartment"),
	aggregatable("never"),
	support_error_info("ISoap"),
	vi_progid("MySoap.Soap"),
	progid("MySoap.Soap.1"),
	version(1.0),
	uuid("57223C1A-A387-447F-8DA9-94EC85A0622B"),
	helpstring("Main CoClass for SOAP.")
]
class ATL_NO_VTABLE CSoap : 
	public ISoap
Any help on this matter would be greatly appreciated.