Re: out parameter in COM method
You can, but using a trick. For example, using a local/call_as
pair of methods and some code you write for the P/S DLL:
[local]
HRESULT GetStruct([out] TestStructType** ppStruct);
[call_as(GetStruct)]]
HRESULT GetStruct_remote([out] long* psz, [out, size_is(*psz)] BYTE**
ppStruct);
You need to manually code the conversion routines for
your interface and compile and link them in the P/S DLL
(note this is in C, not C++):
#define COBJINTERFACES
#include "MIDL_header.h"
HRESULT STDMETHODCALLTYPE IFace_GetStruct_Proxy(LPVOID pThis, struct
TestStructType** ppStruct)
{
long sz;
return IFace_GetStruct_remote_Proxy(pThis, &sz, (BYTE**)ppStruct);
}
HRESULT STDMETHODCALLTYPE IFace_GetStruct_Stub(LPVOID pThis, long* psz,
BYTE** ppStruct)
{
HRESULT hr = IFace_GetStruct(pThis, (struct TestStructType**)ppStruct);
if (SUCCEEDED(hr)) {
*psz = ?; // From the struct data
} else {
*psz = 0;
}
return hr;
}
Note I typed this based on the MIDL documentation after correcting
glaring errors, but I haven't actually compiled it.
Also note, I assumed the struct doesn't have embedded pointers.
If it does, you need to serailize it at the stub and then recreate it
at the proxy making this a true excersize in marshaling :)...
I leave the excersize in passing the struct as an [in] parameter
to you. It shouldn't be very different, but you'd be passing the
data in the opposite direction.
You'd probably quickly realize that writing a pair of methods
and the associated code each time you want to transmit a struct
quickly gets old. MIDL has more advanced mechanisms, but
I haven't used them myself, so can't provide you with snippets.
Look at the following MIDL attributes: transmit_as, represent_as,
wire_marshal, user_marshal. I'd suggest [wire_marshal] based
on the MIDL description.
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@mvps.org
MVP VC FAQ: http://www.mvps.org/vcfaq
=====================================
"Snow" <filamentsnow@hotmail.com> wrote in message
news:es$2fqWfGHA.3456@TK2MSFTNGP05.phx.gbl...
I have a struct with dynamic size, how do I marshall this struct? I do not
want to use another parameter for marshalling size, ie [out,
size_is(dwSize)] and I only want an "out" direction. Is this possible?
HRESULT GetStruct ( [out] TestStructType** ppStruct)
ppStruct has dynamic size
Thanks in advance
"Igor Tandetnik" <itandetnik@mvps.org> wrote in message
news:OiUyt%23HeGHA.3948@TK2MSFTNGP03.phx.gbl...
"JJ" <JJ@discussions.microsoft.com> wrote in message
news:73BB8AF5-29FE-4E5A-962B-84A1A61CBBFD@microsoft.com
I wonder how COM allocates and releases out parameter memory.
The callee allocates, and the caller later releases when it no longer
needs the data.
I programmed CORBA before. In CORBA, if a method has out string
parameter, server allocates memory and client is responsible to
release the memory. Does COM work the same way?
Yes, COM works the same way.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925