Re: Newbee Question: How to return an void* in a VARIANT parameter?
Well, let's say you have the following C API (void* strongly
suggests C instead of C++):
void* GetHandle(whatever);
void UseHandle(void* handle, whatever);
Then you expose this like:
// in original interface
HRESULT GetHandle(wahtever, [out, retval] IDispatch** handler);
// handler interface
{ uuid(...), dual]
interface IHandler : IDispatch {
HRESULT UseHandle(whatever);
}
class CHandler : public IDispatchImpl<IHandler, ...>, ...
{
...
public:
void Init(void* handle) { m_handle = handle; }
STDMETHOD(UseHandle)(whatever) {
::UseHandle(m_handle, whatever);
return S_OK;
}
private:
void* m_handle;
};
STDMETHODIMP class::GetHandle(whatever, IDispatch** ppDisp) {
void* handle = ::GetHandle(whatever);
CComObject<CHandler> *pObj = NULL;
HRESULT hr = CComObject<CHandler>::CreateInstance(&pObj);
if (FAILED(hr)) {
return E_MEMORY;
}
pObj->init(handle);
return pObj->GetUnknown()->QueryInterface(ppDisp);
}
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@mvps.org
MVP VC FAQ: http://vcfaq.mvps.org
=====================================
"Valmir" <vcinquini@gmail.com> wrote in message
news:1176925030.355688.168840@p77g2000hsh.googlegroups.com...
Thanks Alexander, but since I'm a newbee in C++, VC, ATL, etc, I
think it will be a little hard for me to implement.
Would you mind if I ask you to post a quick sample or some directions
on how to do that?
On 18 abr, 16:21, "Alexander Nickolov" <agnicko...@mvps.org> wrote:
Then do as Igor said. Note this is not portable for 64-bit (in case
you care) - you want LONG_PTR for that purpose, which
maps to LONG in 32-bit and __int64 for 64-bit compilation.
Of course the better solution is to wrap all operations associated
with that void pointer and present them as a separate object
which you return to VB6. This object contains the original void
pointer internally and makes all the calls on VB6's behalf. Then
you return IDispatch* of the wrapper object.
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnicko...@mvps.org
MVP VC FAQ:http://vcfaq.mvps.org
=====================================
"Valmir" <vcinqu...@gmail.com> wrote in message
news:1176917484.614439.169240@y80g2000hsf.googlegroups.com...
On 18 abr, 14:07, "Igor Tandetnik" <itandet...@mvps.org> wrote:
Valmir <vcinqu...@gmail.com> wrote:
Hi. I was told to develop an activeX to wrapper function calls to an
c+ + dll, in order to make this dll useful to VB 6 applications.
This another dll has some functions that return void* like the
following:
void* OpenConfiguration(const char* tpCtrl, const char* tpPersist,
const char* tpFormat, const char* tpCripto, const char* flags, int*
ret);
How can I convert a void* which is returned by the function to a
VARIANT var that will be the parameter that VB?will pass to my
ActiveX?
Just return it as long. I assume the only way VB program can use this
value is to pass it back to some other method of your component.
--
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
Exactly. This value will be passed back to the activex to call other
methods.
Thanks