This is my first venture into COM land.
There's a com object I'd like to use for which I have a DLL, and the object's interfaces are already registered.

The interface I wish to implemented is registered as a DUAL, DEFAULT Dispatch interface, and it also has a separate Dispatch interface for Event triggers whose methods are decorated with names like "OnHappyEvent".

The methods of the IDispatch interface itself are found at low offsets in the virtual table of the main interface, just after the IUnknown methods. They include an Invoke method.

When I implement the interface and try coinvoking the methods directly, I don't have much luck - why not, if the interface is DUAL, does it not support vtable calls? Should I be using the Invoke method which this interface exposes via IDispatch? Should I be actually querying for IDispatch under the main interface and using its interface pointer in calls?

Once I can call functions from the main interface without crashing, I'll want to know about implementing its Events interface...

ok so assuming that all the non-IUnknown methods are DISPATCH,
then does this look ok, or should ALL those lil methods be defined the way the _vtIDispatch macro does it?

;IUnknown methods
; IDispatch methods
_vtIDispatch CastName
;Object methods
STDMETHOD get_hostName , :ptr BSTR
STDMETHOD put_hostName , :BSTR
STDMETHOD joinConference
STDMETHOD get_userName , :ptr BSTR
STDMETHOD put_userName , :BSTR
STDMETHOD get_confName , :ptr BSTR
STDMETHOD put_confName , :BSTR
STDMETHOD startTransmit
STDMETHOD stopTransmit
STDMETHOD leaveConference
STDMETHOD get_monitorGain , :ptr SWORD
STDMETHOD put_monitorGain , :SWORD
STDMETHOD get_outputGain , :ptr SWORD
STDMETHOD put_outputGain , :SWORD
STDMETHOD get_inputGain , :ptr SWORD
STDMETHOD put_inputGain , :SWORD
STDMETHOD get_inputMute , :ptr SDWORD
STDMETHOD put_inputMute , :SDWORD
STDMETHOD get_outputMute , :ptr SDWORD
STDMETHOD put_outputMute , :SDWORD
STDMETHOD get_inputSource , :ptr SWORD
STDMETHOD put_inputSource , :SWORD
STDMETHOD get_monitorMute , :ptr SDWORD
STDMETHOD put_monitorMute , :SDWORD
STDMETHOD get_socksVersion , :ptr SWORD
STDMETHOD put_socksVersion , :SWORD
STDMETHOD get_socksHostname , :ptr BSTR
STDMETHOD put_socksHostname , :BSTR
STDMETHOD get_socksPort , :ptr SWORD
STDMETHOD put_socksPort , :SWORD
STDMETHOD get_socksUsername , :ptr BSTR
STDMETHOD put_socksUsername , :BSTR
STDMETHOD get_socksPassword , :ptr BSTR
STDMETHOD put_socksPassword , :BSTR
STDMETHOD get_confKey , :ptr BSTR
STDMETHOD put_confKey , :BSTR
STDMETHOD get_inputAGC , :ptr SDWORD
STDMETHOD get_inputVOX , :ptr SDWORD
STDMETHOD createAndJoinConference
STDMETHOD get_inputVOXSensitivity , :ptr SWORD
STDMETHOD put_inputVOXSensitivity , :SWORD
STDMETHOD get_appInfo , :ptr BSTR
STDMETHOD put_appInfo , :BSTR
STDMETHOD get_soundLocation , :ptr BSTR
STDMETHOD put_soundLocation , :BSTR
Posted on 2003-07-04 00:05:35 by Homer
Ok, no replies, no suprises either :|

I am calling CoCreateInstance to create a interface object, and then querying it for its IDispatch, and then calling IDispatch::Invoke with DISP_PROPERTYGET to fetch BSTR and INT word and dwords from the object's default properties (by name) - so I am understanding what's going on, but when I try to write values to these properties, I get undefined errors, and I'm checking for every error code that m$ has defined for the Invoke method, and its preceding name-id resolution call... so can anyone tell me if they have successfully written bstr's to a com property and if so maybe supply a snippet so I can see where I went wrong ?? I've just been working with m$'s docs and the snippets posted in this forum to get where I am so far, but I'm doing ok I reckon - for example, I only define about 3 GUID's - I realized u dont NEED to define interfaces, if the interface is DualIDispatch and the IDisp methods are upfront and the type lib of the class is registered correctly - just IDispatch is enough, let the IDispatch functions do the dirty work !!! It's cheesy, easy and I'll post a decent example of working this way as soon as I have a reason to code one :tongue:
Posted on 2003-07-06 10:24:56 by Homer
The error turned out to be "Failed to Marshal Interface" - curious !!
So I start thinking to myself "did my connection to the object expire? should I be "keeping it alive" or something like that ?"
It' a bit weird considering Reading the properties isn't a problem
This is an ATL object, and I don't know anything about anything :(
I'll just muddle my way through as usual - and if all else fails, I'll start using those cruddy macros too :(
Posted on 2003-07-08 01:34:26 by Homer
It's cheesy, easy and I'll post a decent example of working this way as soon as I have a reason to code one

Hey.. cheezy as Visual Basic, and VBA for aplications, etc. This is how they do their "magic" and how when you type the method name on an object, it magically knows what the parameters are, etc. etc. Its all becuase every object call goes through a COM interface with dispatchable interfaces, just as your describing. So in short your writting an example of the Essense of Visual Basic ;)

..and if all else fails, I'll start using those cruddy macros too

They are far from "cruddy". The macro set that both Ernie and Japheth have defined are extremely user friendly and make life far easier. I would not practice COM without in my opinion. I can give you examples of calling interfaces with BSTR params, that were done by the IDispatch:Invoke method. But the are all macro and sub-function calls....

Posted on 2003-07-08 21:37:01 by NaN
I'm using coinvoke and the other usual suspects, aka

coinvoke IYAcs, IDispatch,Invoke,idProp, addr IID_NULL, LOCALE_USER_DEFAULT,DISPATCH_PROPERTYGET,addr pxParams,addr MyVariant,0,0

and not much else... I don't suppose it could hurt to use the higher com macros but japhephs includes didnt marry neatly to my existing masm includes and it looked like a pain, and besides I prefer to understand the underlying mechanics of the interface data transactions as I'm sure you can appreciate, being as many of us are machinecoders at heart, regardless of what else we do...

I'd certainly love to see any clear-coded implementation of propertyput under idispatch tyvm :)

I'm still not getting anywhere :( I can call Methods, I can query any kind of property for its value, but I can't set the values of those same properties :(
Frustrated he was, and grew his sadness, it did.
Posted on 2003-07-09 08:45:01 by Homer
Hi EvilHomer2k,

setting a property differs from getting one that IDispatch::Invoke call requires a named argument, DISPID_PROPERTYPUT. Possibly thats the reason for your problems.

I wonder myself a bit why you dont post your code to give others a chance to find the error.

Posted on 2003-07-09 08:50:17 by japheth
Not a problem:

;Performs a PUT of a BSTR on a PROPERTY of IYAcs Interface
PutPropertyString PROC pMethodName:DWORD, cArgs:DWORD, pBuffer:DWORD, cbSize:DWORD

mov eax,pMethodName
mov ebx,pBuffer
mov ecx,cbSize
.if eax==0
invoke MessageBox,0,CTXT("No Method Name?"),CTXT("Syntax Error!"),MB_OK+MB_ICONERROR
return FALSE
mov MyVariant.vt, VT_BSTR
;mov MyVariant.wReserved1, 0
;mov MyVariant.wReserved2, 0
;mov MyVariant.wReserved3, 0

invoke ascii2unicode, pMethodName, pBuffer, cbSize
invoke SysAllocString, pBuffer
mov MyVariant.bstrVal,eax

mov idProp,$invoke (GetPropertyID,pMethodName)
.if eax==0
jmp auwParam

;----------------- fill param struc
invoke RtlZeroMemory, addr xParams, sizeof xParams
xor edx, edx
lea ebx,xParams
mov pxParams,ebx
lea ebx,MyVariant
mov xParams.rgvarg, ebx

mov ecx, cArgs
mov xParams.cArgs, cx

mov xParams.cNamedArgs, 1
lea ecx, dwPut
mov xParams.rgdispidNamedArgs, ecx

xor eax, eax
coinvoke IYAcs, IDispatch,Invoke,idProp, addr IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,addr pxParams,0,0,addr xError
.if eax !=0
push eax
invoke MessageBox,0,CTXT("Bad #Params"),CTXT("cool"),MB_OK
pop eax
.elseif eax==DISP_E_BADVARTYPE
push eax
invoke MessageBox,0,CTXT("Bad Arg in rgvarg"),CTXT("cool"),MB_OK
pop eax
.elseif eax==DISP_E_EXCEPTION
push eax
invoke MessageBox,0,CTXT("I'm meant to raise an Exception"),CTXT("cool"),MB_OK
pop eax
push eax
invoke MessageBox,0,CTXT("Nonexistant Member or ReadOnly"),CTXT("cool"),MB_OK
pop eax
push eax
invoke MessageBox,0,CTXT("This Method doesn't support Named Args"),CTXT("cool"),MB_OK
pop eax
.elseif eax==DISP_E_OVERFLOW
push eax
invoke MessageBox,0,CTXT("One of the arguments in rgvarg could not be coerced to the specified type"),CTXT("cool"),MB_OK
pop eax
push eax
invoke MessageBox,0,CTXT("One of the IDs is wrong or a Parm is missing"),CTXT("cool"),MB_OK
pop eax
push eax
invoke MessageBox,0,CTXT("One of the arguments in rgvarg could not be coerced "),CTXT("cool"),MB_OK
pop eax
push eax
invoke MessageBox,0,CTXT("Unknown Interface "),CTXT("cool"),MB_OK
pop eax
push eax
invoke MessageBox,0,CTXT("Unknown LCID "),CTXT("cool"),MB_OK
pop eax
push eax
invoke MessageBox,0,CTXT("Not enough Params "),CTXT("cool"),MB_OK
pop eax
jmp auwParam
jmp auwExit
jmp @F
auwParam: mov eax, E_INVALIDARG
jmp auwExit
auwError: call GetLastError
auwExit: ret

.if eax!=0
invoke wsprintf,addr szBuffer3,CTXT("Error#%lu"),xError
invoke SysFreeString,MyVariant.bstrVal
invoke MessageBox,0,addr szBuffer3,CTXT("Syntax Error!"),MB_OK+MB_ICONERROR
return FALSE
return TRUE
PutPropertyString ENDP

oh, and this...

GetPropertyID PROC pPropertyName:DWORD
LOCAL WideBuffer[512]:BYTE
LOCAL pWideBuffer:BSTR

lea eax,WideBuffer
mov pWideBuffer,eax
invoke ascii2unicode, pPropertyName, addr WideBuffer, sizeof WideBuffer
.if eax==FALSE
invoke MessageBox,0,CTXT("Failed AsciiToUnicode"),CTXT("cool"),MB_OK
return NULL
mov idProp,NULL
coinvoke IYAcs, IDispatch,GetIDsOfNames, addr IID_NULL, addr pWideBuffer, 1, LOCALE_USER_DEFAULT, addr idProp

.if eax !=0
invoke MessageBox,0,CTXT("Failed to find ID of Method"),CTXT("cool"),MB_OK
.elseif idProp==NULL
invoke MessageBox,0,CTXT("Failed to identify Properties"),CTXT("cool"),MB_OK
return idProp
return NULL
GetPropertyID ENDP
Posted on 2003-07-09 10:08:30 by Homer


xor eax, eax
coinvoke IYAcs, IDispatch,Invoke,idProp, addr IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,addr pxParams,0,0,addr xError
.if eax !=0

be changed to

xor eax, eax
coinvoke IYAcs, IDispatch,Invoke,idProp, addr IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT,pxParams,0,0,addr xError
.if eax !=0

Posted on 2003-07-09 12:33:35 by japheth
Ofcourse, I've tried both, neither was successful.. is there anything else obviously flawed or does it look pretty much right to you too? This source was translated from a snippet I found over at msdn. The erroneous dispatch method in that call was due to the fact that I've been fiddling with it, hoping that I'd either misinterpreted something or made a simple typographical error.
Now if it wasn't for the fact that your COMVIEW tool has no problems setting these properties I'd be thinking that the com object itself was displaying some kind of security against my client (something I only just learned about) but the bottom line here is that I'm simply doing something wrong. But what?
I have also learned that the ITypeInfo interface can access the Dispatch methods too which seems odd to me since theres no inheritance here...
So which of the possibles does your COMVIEW use to create instances and call methods of an interface (since its working and mine isn't, I'd really like to understand where the difference lies)
Any help or advice is of course much appreciated, and I thank you for your time.
Posted on 2003-07-10 01:51:40 by Homer
comview uses CoCreateInstance (;) ) and uses IDispatch::Invoke like your source. Your code looks ok to me now. So what error do you receive now? There are some "standard" (more or less well known) IDispatch::Invoke errors which will indicate a wrong call:


or else you get an error from the object you are calling

Posted on 2003-07-10 05:33:22 by japheth
This is only indirectly pertinent to the current discussion,
but I've found COLIB dependent code to be problematic on Win2K. My humble recommendation is to remove all COLIB dependencies from your code entirely if you're running Win2K.
Posted on 2003-07-10 22:21:24 by Poimander

this colib stuff has its problems, but EvilHomer2k doesnt create a server object, he just uses one. So only bugs in COM include files may matter (there exist some, for example in OAIDL.INC, thats because I would suggest to use the ones supplied with comview)

Posted on 2003-07-11 00:11:30 by japheth
Thanks for the clarification japheth. That's essentially what I was
refering to when I cited 'COLIB dependencies'.
Posted on 2003-07-11 17:54:34 by Poimander
The error concerned is "80020011" which translates to "Does not support a collection". What the heck is that all about?
ummm... I replaced all my includes with japheph's ones from his comview source package to see if that would get me sorted, on account of what you guys just said about them... so that certainly narrows the scope !
We're using the same build-time includes now I expect.

For future reference .. the WINERROR.H automation error codes

Error/Dec. Error/Hex Error Description

-2147418113 (8000FFFF) Catastrophic failure
-2147467263 (80004001) Not implemented
-2147024882 (8007000E) Ran out of memory
-2147024809 (80070057) One or more arguments are invalid
-2147467262 (80004002) No such interface supported
-2147467261 (80004003) Invalid pointer
-2147024890 (80070006) Invalid handle
-2147467260 (80004004) Operation aborted
-2147467259 (80004005) Unspecified error
-2147024891 (80070005) General access denied error
-2147483647 (80000001) Not implemented
-2147483646 (80000002) Ran out of memory
-2147483645 (80000003) One or more arguments are invalid
-2147483644 (80000004) No such interface supported
-2147483643 (80000005) Invalid pointer
-2147483642 (80000006) Invalid handle
-2147483641 (80000007) Operation aborted
-2147483640 (80000008) Unspecified error
-2147483639 (80000009) General access denied error
-2147483638 (8000000A) The data necessary to complete this operation
not yet available.
-2147467258 (80004006) Thread local storage failure
-2147467257 (80004007) Get shared memory allocator failure
-2147467256 (80004008) Get memory allocator failure
-2147467255 (84009) Unable to initialize class cache
-2147467254 (8400A) Unable to initialize RPC services
-2147467253 (8000400B) Cannot set thread local storage channel control
-2147467252 (8000400C) Could not allocate thread local storage channel
-2147467251 (8000400D) The user supplied memory allocator is
-2147467250 (8000400E) The OLE service mutex already exists
-2147467249 (8000400F) The OLE service file mapping already exists
-2147467248 (80004010) Unable to map view of file for OLE service
-2147467247 (80004011) Failure attempting to launch OLE service
-2147467246 (80004012) There was an attempt to call CoInitialize a
second time while single threaded
-2147467245 (80004013) A Remote activation was necessary but was not
-2147467244 (80004014) A Remote activation was necessary but the server
name provided was invalid
-2147467243 (80004015) The class is configured to run as a security id
different from the caller
-2147467242 (80004016) Use of Ole1 services requiring DDE windows is
-2147467241 (80004017) A RunAs specification must be <domain name>\<user
name> or simply <user name>
-2147467240 (80004018) The server process could not be started. The
pathname may be incorrect.
-2147467239 (80004019) The server process could not be started as the
configured identity. The pathname may be
incorrect or unavailable.
-2147467238 (8000401A) The server process could not be started because
the configured identity is incorrect. Check the
username and password.
-2147467237 (8000401B) The client is not allowed to launch this server.
-2147467236 (8000401C) The service providing this server could not be
-2147467235 (8000401D) This computer was unable to communicate with the
computer providing the server.
-2147467234 (8000401E) The server did not respond after being launched.
-2147467233 (8000401F) The registration information for this server is
inconsistent or incomplete.
-2147467232 (80004020) The registration information for this interface
is inconsistent or incomplete.
-2147467231 (80004021) The operation attempted is not supported.
-2147221504 (80040000) Invalid OLEVERB structure
-2147221503 (80040001) Invalid advise flags
-2147221502 (80040002) Can't enumerate any more, because the associated
data is missing
-2147221501 (80040003) This implementation doesn't take advises
-2147221500 (80040004) There is no connection for this connection ID
-2147221499 (80040005) Need to run the object to perform this operation
-2147221498 (80040006) There is no cache to operate on
-2147221497 (80040007) Uninitialized object
-2147221496 (80040008) Linked object's source class has changed
-2147221495 (80040009) Not able to get the moniker of the object
-2147221494 (8004000A) Not able to bind to the source
-2147221493 (8004000B) Object is static; operation not allowed
-2147221492 (8004000C) User cancelled out of save dialog
-2147221491 (8004000D) Invalid rectangle
-2147221490 (8004000E) compobj.dll is too old for the ole2.dll
-2147221489 (8004000F) Invalid window handle
-2147221488 (80040010) Object is not in any of the inplace active states
-2147221487 (80040011) Not able to convert object
-2147221486 (80040012) Not able to perform the operation because object
is not given storage yet
-2147221404 (80040064) Invalid FORMATETC structure
-2147221403 (80040065) Invalid DVTARGETDEVICE structure
-2147221402 (80040066) Invalid STDGMEDIUM structure
-2147221401 (80040067) Invalid STATDATA structure
-2147221400 (80040068) Invalid lindex
-2147221399 (80040069) Invalid tymed
-2147221398 (8004006A) Invalid clipboard format
-2147221397 (8004006B) Invalid aspect(s)
-2147221396 (8004006C) tdSize parameter of the DVTARGETDEVICE structure
is invalid
-2147221395 (8004006D) Object doesn't support IViewObject interface
-2147221248 (80040100) Trying to revoke a drop target that has not been
-2147221247 (80040101) This window has already been registered as a drop
-2147221246 (80040102) Invalid window handle
-2147221232 (80040110) Class does not support aggregation (or class
object is remote)
-2147221231 (80040111) ClassFactory cannot supply requested class
-2147221184 (80040140) Error drawing view
-2147221168 (80040150) Could not read key from registry
-2147221167 (80040151) Could not write key to registry
-2147221166 (80040152) Could not find the key in the registry
-2147221165 (80040153) Invalid value for registry
-2147221164 (80040154) Class not registered
-2147221163 (80040155) Interface not registered
-2147221136 (80040170) Cache not updated
-2147221120 (80040180) No verbs for OLE object
-2147221119 (80040181) Invalid verb for OLE object
-2147221088 (800401A0) Undo is not available
-2147221087 (800401A1) Space for tools is not available
-2147221056 (800401C0) OLESTREAM Get method failed
-2147221055 (800401C1) OLESTREAM Put method failed
-2147221054 (800401C2) Contents of the OLESTREAM not in correct format
-2147221053 (800401C3) There was an error in a Windows GDI call while
converting the bitmap to a DIB
-2147221052 (800401C4) Contents of the IStorage not in correct format
-2147221051 (800401C5) Contents of IStorage is missing one of the
standard streams
-2147221050 (800401C6) There was an error in a Windows GDI call while
converting the DIB to a bitmap.
-2147221040 (800401D0) OpenClipboard Failed
-2147221039 (800401D1) EmptyClipboard Failed
-2147221038 (800401D2) SetClipboard Failed
-2147221037 (800401D3) Data on clipboard is invalid
-2147221036 (800401D4) CloseClipboard Failed
-2147221024 (800401E0) Moniker needs to be connected manually
-2147221023 (800401E1) Operation exceeded deadline
-2147221022 (800401E2) Moniker needs to be generic
-2147221021 (800401E3) Operation unavailable
-2147221020 (800401E4) Invalid syntax
-2147221019 (800401E5) No object for moniker
-2147221018 (800401E6) Bad extension for file
-2147221017 (800401E7) Intermediate operation failed
-2147221016 (800401E8) Moniker is not bindable
-2147221015 (800401E9) Moniker is not bound
-2147221014 (800401EA) Moniker cannot open file
-2147221013 (800401EB) User input required for operation to succeed
-2147221012 (800401EC) Moniker class has no inverse
-2147221011 (800401ED) Moniker does not refer to storage
-2147221010 (800401EE) No common prefix
-2147221009 (800401EF) Moniker could not be enumerated
-2147221008 (800401F0) CoInitialize has not been called.
-2147221007 (800401F1) CoInitialize has already been called.
-2147221006 (800401F2) Class of object cannot be determined
-2147221005 (800401F3) Invalid class string
-2147221004 (800401F4) Invalid interface string
-2147221003 (800401F5) Application not found
-2147221002 (800401F6) Application cannot be run more than once
-2147221001 (800401F7) Some error in application program
-2147221000 (800401F8) DLL for class not found
-2147220999 (800401F9) Error in the DLL
-2147220998 (800401FA) Wrong OS or OS version for application
-2147220997 (800401FB) Object is not registered
-2147220996 (800401FC) Object is already registered
-2147220995 (800401FD) Object is not connected to server
-2147220994 (800401FE) Application was launched but it didn't register a
class factory
-2147220993 (800401FF) Object has been released
-2146959359 (80080001) Attempt to create a class object failed
-2146959358 (80080002) OLE service could not bind object
-2146959357 (80080003) RPC communication failed with OLE service
-2146959356 (80080004) Bad path to object
-2146959355 (80080005) Server execution failed
-2146959354 (80080006) OLE service could not communicate with the object
-2146959353 (80080007) Moniker path could not be normalized
-2146959352 (80080008) Object server is stopping when OLE service
contacts it
-2146959351 (80080009) An invalid root block pointer was specified
-2146959344 (80080010) An allocation chain contained an invalid link
-2146959343 (80080011) The requested allocation size was too large
-2147352575 (80020001) Unknown interface.
-2147352573 (80020003) Member not found.
-2147352572 (80020004) Parameter not found.
-2147352571 (80020005) Type mismatch.
-2147352570 (80020006) Unknown name.
-2147352569 (80020007) No named arguments.
-2147352568 (80020008) Bad variable type.
-2147352567 (80020009) Exception occurred.
-2147352566 (8002000A) Out of present range.
-2147352565 (8002000B) Invalid index.
-2147352564 (8002000C) Unknown language.
-2147352563 (8002000D) Memory is locked.
-2147352562 (8002000E) Invalid number of parameters.
-2147352561 (8002000F) Parameter not optional.
-2147352560 (80020010) Invalid callee.
-2147352559 (80020011) Does not support a collection.
-2147319786 (80028016) Buffer too small.
-2147319784 (80028018) Old format or invalid type library.
-2147319783 (80028019) Old format or invalid type library.
-2147319780 (8002801C) Error accessing the OLE registry.
-2147319779 (8002801D) Library not registered.
-2147319769 (80028027) Bound to unknown type.
-2147319768 (80028028) Qualified name disallowed.
-2147319767 (80028029) Invalid forward reference, or reference to
uncompiled type.
-2147319766 (8002802A) Type mismatch.
-2147319765 (8002802B) Element not found.
-2147319764 (8002802C) Ambiguous name.
-2147319763 (8002802D) Name already exists in the library.
-2147319762 (8002802E) Unknown LCID.
-2147319761 (8002802F) Function not defined in specified DLL.
-2147317571 (800288BD) Wrong module kind for the operation.
-2147317563 (800288C5) Size may not exceed 64K.
-2147317562 (800288C6) Duplicate ID in inheritance hierarchy.
-2147317553 (800288CF) Incorrect inheritance depth in standard OLE
-2147316576 (80028CA0) Type mismatch.
-2147316575 (80028CA1) Invalid number of arguments.
-2147316574 (80028CA2) I/O Error.
-2147316573 (80028CA3) Error creating unique tmp file.
-2147312566 (80029C4A) Error loading type library/DLL.
-2147312509 (80029C83) Inconsistent property functions.
-2147312508 (80029C84) Circular dependency between types/modules.
-2147287039 (80030001) Unable to perform requested operation.
-2147287038 (80030002) %1 could not be found.
-2147287037 (80030003) The path %1 could not be found.
-2147287036 (80030004) There are insufficient resources to open another
-2147287035 (80030005) Access Denied.
-2147287034 (80030006) Attempted an operation on an invalid object.
-2147287032 (80030008) There is insufficient memory available to
complete operation.
-2147287031 (80030009) Invalid pointer error.
-2147287022 (80030012) There are no more entries to return.
-2147287021 (80030013) Disk is write-protected.
-2147287015 (80030019) An error occurred during a seek operation.
-2147287011 (8003001D) A disk error occurred during a write operation.
-2147287010 (8003001E) A disk error occurred during a read operation.
-2147287008 (80030020) A share violation has occurred.
-2147287007 (80030021) A lock violation has occurred.
-2147286960 (80030050) %1 already exists.
-2147286953 (80030057) Invalid parameter error.
-2147286928 (80030070) There is insufficient disk space to complete
-2147286800 (800300F0) Illegal write of non-simple property to simple
property set.
-2147286790 (800300FA) An API call exited abnormally.
-2147286789 (800300FB) The file %1 is not a valid compound file.
-2147286788 (800300FC) The name %1 is not valid.
-2147286787 (800300FD) An unexpected error occurred.
-2147286786 (800300FE) That function is not implemented.
-2147286785 (800300FF) Invalid flag error.
-2147286784 (80030100) Attempted to use an object that is busy.
-2147286783 (80030101) The storage has been changed since the last
-2147286782 (80030102) Attempted to use an object that has ceased to
-2147286781 (80030103) Can't save.
-2147286780 (80030104) The compound file %1 was produced with an
incompatible version of storage.
-2147286779 (80030105) The compound file %1 was produced with a newer
version of storage.
-2147286778 (80030106) Share.exe or equivalent is required for
-2147286777 (80030107) Illegal operation called on non-file based
-2147286776 (80030108) Illegal operation called on object with extant
-2147286775 (80030109) The docfile has been corrupted.
-2147286768 (80030110) OLE32.DLL has been loaded at the wrong address.
-2147286527 (80030201) The file download was aborted abnormally. The
file is incomplete.
-2147286526 (80030202) The file download has been terminated.
-2147418111 (80010001) Call was rejected by callee.
-2147418110 (80010002) Call was canceled by the message filter.
-2147418109 (80010003) The caller is dispatching an intertask
SendMessage call and cannot call out via
-2147418108 (80010004) The caller is dispatching an asynchronous call
and cannot make an outgoing call on behalf of
this call.
-2147418107 (80010005) It is illegal to call out while inside message
-2147418106 (80010006) The connection terminated or is in a bogus state
and cannot be used any more. Other connections
are still valid.
-2147418105 (80010007) The callee (server [not server application]) is
not available and disappeared; all connections
are invalid. The call may have executed.
-2147418104 (80010008) The caller (client) disappeared while the callee
(server) was processing a call.
-2147418103 (80010009) The data packet with the marshalled parameter
data is incorrect.
-2147418102 (8001000A) The call was not transmitted properly; the
message queue was full and was not emptied after
-2147418101 (8001000B) The client (caller) cannot marshal the parameter
data - low memory, etc.
-2147418100 (8001000C) The client (caller) cannot unmarshal the return
data - low memory, etc.
-2147418099 (8001000D) The server (callee) cannot marshal the return
data - low memory, etc.
-2147418098 (8001000E) The server (callee) cannot unmarshal the
parameter data - low memory, etc.
-2147418097 (8001000F) Received data is invalid; could be server or
client data.
-2147418096 (80010010) A particular parameter is invalid and cannot be
-2147418095 (80010011) There is no second outgoing call on same channel
in DDE conversation.
-2147418094 (80010012) The callee (server [not server application]) is
not available and disappeared; all connections
are invalid. The call did not execute.
-2147417856 (80010100) System call failed.
-2147417855 (80010101) Could not allocate some required resource
(memory, events, ...)
-2147417854 (80010102) Attempted to make calls on more than one thread
in single threaded mode.
-2147417853 (80010103) The requested interface is not registered on the
server object.
-2147417852 (80010104) RPC could not call the server or could not return
the results of calling the server.
-2147417851 (80010105) The server threw an exception.
-2147417850 (80010106) Cannot change thread mode after it is set.
-2147417849 (80010107) The method called does not exist on the server.
-2147417848 (80010108) The object invoked has disconnected from its
-2147417847 (80010109) The object invoked chose not to process the call
now. Try again later.
-2147417846 (8001010A) The message filter indicated that the application
is busy.
-2147417845 (8001010B) The message filter rejected the call.
-2147417844 (8001010C) A call control interfaces was called with invalid
-2147417843 (8001010D) An outgoing call cannot be made since the
application is dispatching an input-synchronous
-2147417842 (8001010E) The application called an interface that was
marshalled for a different thread.
-2147417841 (8001010F) CoInitialize has not been called on the current
-2147417840 (80010110) The version of OLE on the client and server
machines does not match.
-2147417839 (80010111) OLE received a packet with an invalid header.
-2147417838 (80010112) OLE received a packet with an invalid extension.
-2147417837 (80010113) The requested object or interface does not exist.
-2147417836 (80010114) The requested object does not exist.
-2147417835 (80010115) OLE has sent a request and is waiting for a
-2147417834 (80010116) OLE is waiting before retrying a request.
-2147417833 (80010117) Call context cannot be accessed after call
-2147417832 (80010118) Impersonate on unsecured calls is not supported.
-2147417831 (80010119) Security must be initialized before any
interfaces are marshalled or unmarshalled. It
cannot be changed once initialized.
-2147417830 (8001011A) No security packages are installed on this
machine or the user is not logged on or there are
no compatible security packages between the
client and server.
-2147417829 (8001011B) Access is denied.
-2147417828 (8001011C) Remote calls are not allowed for this process.
-2147417827 (8001011D) The marshalled interface data packet (OBJREF) has
an invalid or unknown format.
-2147352577 (8001FFFF) An internal error occurred.
-2146893823 (80090001) Bad UID.
-2146893822 (80090002) Bad Hash.
-2146893821 (80090003) Bad Key.
-2146893820 (80090004) Bad Length.
-2146893819 (80090005) Bad Data.
-2146893818 (80090006) Invalid Signature.
-2146893817 (80090007) Bad Version of provider.
-2146893816 (80090008) Invalid algorithm specified.
-2146893815 (80090009) Invalid flags specified.
-2146893814 (8009000A) Invalid type specified.
-2146893813 (8009000B) Key not valid for use in specified state.
-2146893812 (8009000C) Hash not valid for use in specified state.
-2146893811 (8009000D) Key does not exist.
-2146893810 (8009000E) Insufficient memory available for the operation.
-2146893809 (8009000F) Object already exists.
-2146893808 (80090010) Access denied.
-2146893807 (80090011) Object was not found.
-2146893806 (80090012) Data already encrypted.
-2146893805 (80090013) Invalid provider specified.
-2146893804 (80090014) Invalid provider type specified.
-2146893803 (80090015) Provider's public key is invalid.
-2146893802 (80090016) Keyset does not exist
-2146893801 (80090017) Provider type not defined.
-2146893800 (80090018) Provider type as registered is invalid.
-2146893799 (80090019) The keyset is not defined.
-2146893798 (8009001A) Keyset as registered is invalid.
-2146893797 (8009001B) Provider type does not match registered value.
-2146893796 (8009001C) The digital signature file is corrupt.
-2146893795 (8009001D) Provider DLL failed to initialize correctly.
-2146893794 (8009001E) Provider DLL could not be found.
-2146893793 (8009001F) The Keyset parameter is invalid.
-2146893792 (80090020) An internal error occurred.
-2146893791 (80090021) A base error occurred.
-2146762751 (800B0001) The specified trust provider is not known on this
-2146762750 (800B0002) The trust verification action specified is not
supported by the specified trust provider.
-2146762749 (800B0003) The form specified for the subject is not one
supported or known by the specified trust
-2146762748 (800B0004) The subject is not trusted for the specified
-2146762747 (800B0005) Error due to problem in ASN.1 encoding process.
-2146762746 (800B0006) Error due to problem in ASN.1 decoding process.
-2146762745 (800B0007) Reading / writing Extensions where Attributes are
appropriate, and visa versa.
-2146762744 (800B0008) Unspecified cryptographic failure.
-2146762743 (800B0009) The size of the data could not be determined.
-2146762742 (800B000A) The size of the indefinite-sized data could not
be determined.
-2146762741 (800B000B) This object does not read and write self-sizing
-2146762496 (800B0100) No signature was present in the subject.
-2146762495 (800B0101) A required certificate is not within its validity
-2146762494 (800B0102) The validity periods of the certification chain
do not nest correctly.
-2146762493 (800B0103) A certificate that can only be used as an
end-entity is being used as a CA or visa versa.
-2146762492 (800B0104) A path length constraint in the certification
chain has been violated.
-2146762491 (800B0105) An extension of unknown type that is labeled
'critical' is present in a certificate.
-2146762490 (800B0106) A certificate is being used for a purpose other
than that for which it is permitted.
-2146762489 (800B0107) A parent of a given certificate in fact did not
issue that child certificate.
-2146762488 (800B0108) A certificate is missing or has an empty value
for an important field, such as a subject or
issuer name.
-2146762487 (800B0109) A certification chain processed correctly, but
terminated in a root certificate which isn't
trusted by the trust provider.
-2146762486 (800B010A) A chain of certs didn't chain as they should in a
certain application of chaining.

Posted on 2003-07-11 19:14:30 by Homer
EvilHomer2k, You may want to review the .idl file prototype
of the interface method you're working with in order to verify the
parameters are packaged properly and are of the right type.
For example if the method requires a VARIANT argument, the
VARIANT has to be set up correctly otherwise the method breaks
Posted on 2003-07-11 21:34:54 by Poimander

the error you are receiving now doesn't come from IDispatch helper functions (like DispGetParams), so its not a syntax error and it is returned by the object itself. So check your parameter values, for example:

invoke ascii2unicode, pMethodName, pBuffer, cbSize
invoke SysAllocString, pBuffer
mov MyVariant.bstrVal,eax

Why do you supply name of the method as BSTR parameter? That looks useless to me.

BTW, I would suggest to change your code:

invoke VariantInit, addr MyVariant ;<--- insert
mov MyVariant.vt, VT_BSTR

just to be on the safe side.

Posted on 2003-07-12 02:28:54 by japheth
Well, I continued pulling hair out for a couple more days, and then I decided that something was really up - so rather than add the extra overhead of implementing the interface indirectly, I fell back on the vtable for PUT methods - and it works.
This atl stuff is weird - I'm not allowed to GET anything using the vtable, and I'm not allowed to PUT using Dispatch::Invoke !!
Anyways, it's working, and I'm now looking forwards to implementing the Events subinterface ...
Now I need to have a bit more finesse when it comes to actually creating my root object instance - I'm supposed to implement a copy of the Events interface in my client(sink), then associate it with the existing Events interface(source), right?
Considering the IEvents is DISPATCH only, is there an easier way to late-bind just the callback members I'm interested in?
Furthermore, is there a way check for and enumerate running instances of the object and bind to them rather than creating a new one, should we find that at least one already exists?
I'm switching over to use the dm() for the next bit :)
Posted on 2003-07-13 00:21:07 by Homer
Hi, Evilhomer2k

Congratulations for your working prog!

since this outgoing interface (events) is dispatchonly, you will have to supply an IDispatch interface when connecting. So for every event your IDispatch::Invoke proc will be called and you may easily select the ones you are interested in simply by comparing the DISPIDs.

Running servers may register themselves in the running object table (ROT). For a client, check function GetActiveObject().

Posted on 2003-07-13 02:09:59 by japheth
Ok so I don't have to implement the entire interface on the clientside, just its frontend, thats cool... I've found my way through the IConnectionPointContainer to IConnectionPoint, but I come unstuck when it comes to creating my local interface (I'm trying to use AllocObject - but I haven't really defined anything).

My question for today is pretty easy, methinks...If my Dispatch interface looks something like this:

_vtlMyDispatch MACRO CastName:REQ
_vtIUnknown CastName
&CastName&_GetTypeInfoCount comethod1 ?
&CastName&_GetTypeInfo comethod3 ?
&CastName&_GetIDsOfNames comethod5 ?
&CastName&_Invoke_ comethod8 ?

IMyDispatch STRUCT
_vtlMyDispatch IMyDispatch
IMyDispatch ENDS

LPMYDISPATCH typedef ptr IMyDispatch

...then how do I point the Invoke_ method at my handler?
Furthermore, can I expect IConnectionPoint_Advise to query my interface to check for its suitability to be connected to the outgoing (events) interface? (An idiots check for #methods, that kind of thing?) - or is it totally naive?
I'm about to find out I guess :)

I like your suggestion anyway in regards to intercepting calls via the dispatch invoke method rather than cloning the interface structure in memory - but on that note, have you ever needed to clone an interface in memory, maybe messing with the pointers and then using it as a sink?
Thanks, Homer.
Posted on 2003-07-16 08:20:16 by Homer
An event sink IDispatch can be rather simple.

1. your QueryInterface method should succeed for IUnknown, IDispatch and <IEventSink>
<IEventSink> stands for the source interface IID you get from the object
2. methods GetIdsOfNames, GetTypeInfoCount and GetTypeInfo can simly return E_FAIL, since
the object should know everything about this interface, at least better than you :) . So besides
the IUnknown methods you will have to code an IDispatch::Invoke proc, nothing else.
3. After calling Advise the object will call your sink's QueryInterfacewith IID of <IEventSink>, thats all

...then how do I point the Invoke_ method at my handler?

Dont understand this question. You must supply an object (your eventsink object) to someone else,
so you have to create a vtable with method Invoke_ in it, which will be address of your invoke proc.
Posted on 2003-07-16 12:15:09 by japheth