Jay,
ITLegacyCallMediaControl2 is an extension of the ITLegacyCallMediaControl
which is one of the interfaces of the TAPI3 call object created when an
address connects to another one. GetIDAsVariant() is a method of the
ITLegacyCallMediaControl2 interface (in C++, it is
ITLegacyCallMediaControl::GetID()).
I don't understand either why the return of
ITLegacyCallMediaControl2::GetIDAsVariant() is so opaque. It seems like it's
a low level function.
Here are some pieces of the related code :
Dim tapi As ITTAPI
Dim adresse As ITAddress
Dim appel As ITBasicCallControl
Dim telephoneNumber as String
'Create the tapi object.
tapi = New TAPI
'Call Initialize before calling any other TAPI function.
Call tapi.Initialize()
...
'adresse is one of the tapi.Addresses
...
'create a data call to a phone number
appel = adresse.CreateCall(telephoneNumber,
TapiConstants.LINEADDRESSTYPE_PHONENUMBER,
TapiConstants.TAPIMEDIATYPE_DATAMODEM)
appel.Connect(False)
...
'gets the TAPI3 comm port name
Dim portName As Byte() =
appel.GetIDAsVariant("comm/datamodem/portname")
'portName has to be converted to a String, each byte becoming a Char
of the String
'gets the TAPI3 comm port handle
Dim obj As Object = appel.GetIDAsVariant("comm/datamodem")
Dim hPort As IntPtr = Marshal.ReadIntPtr(obj, 0)
'now, you can use this handle in Win32 WriteFile(), ReadFile() calls
...
"Jay B. Harlow" wrote:
> Serge,
> I would not expect a Handle to be returned as a Byte().
>
> I would expect a Handle to be returned as an Integer...
>
> How is your ITLegacyCallMediaControl2 defined?
>
>
> --
> Hope this helps
> Jay B. Harlow
> .NET Application Architect, Enthusiast, & Evangelist
> T.S. Bradley - http://www.tsbradley.net
>
>
> "Serge BRIC" <(E-Mail Removed)> wrote in message
> news:BAEF8A64-1BDF-4D86-9340-(E-Mail Removed)...
> > Jay,
> >
> > You're right, GetIDAsVariant() returns a COM Variant in C++ exposed as a
> > System.Object in .NET. It appears that the type of this .NET object is
> > System.Array and that the type of each item of this array is a byte. This
> > is
> > why I was trying to interpret it as an array of bytes (Byte()).
> >
> > I found on the TAPI newsgroup that the correct way of getting the com port
> > handle in C++ from a ITLegacyCallMediaControl object (TAPI3 object) was
> > something like :
> >
> > BSTR bstrComm = ::SysAllocString(L"comm/datamodem");
> > BYTE *pDeviceID;
> > DWORD dwSize;
> > ITLegacyCallMediaControl *pCallMediaControl;
> > ...
> > HRESULT hr = pCallMediaControl->GetID(bstrComm, &dwSize, &pDeviceID);
> > HANDLE handle = *((LPHANDLE)pDeviceID);
> >
> > So, in VB, it is:
> >
> > Dim appel As ITLegacyCallMediaControl2
> > ...
> > Dim obj As Object =
> > callMediaControl.GetIDAsVariant("comm/datamodem")
> > Dim handle As IntPtr = Marshal.ReadIntPtr(obj, 0)
> >
> > Thanks for your help.
> >
> >
> > "Jay B. Harlow" wrote:
> >
> >> Serge,
> >> > Dim vFileHandle As Byte() = appel.GetIDAsVariant("comm/datamodem")
> >> Why is GetIDAsVariant returning a Byte()? It appears that it really
> >> should
> >> return a COM VARIANT, in the .NET world COM Variants are exposed as
> >> System.Object.
> >>
> >> As TDC suggested: System.Runtime.Interop.Marshal is your friend here. It
> >> has
> >> methods to marshal (convert/translate) between the COM/C++ (unmanaged)
> >> world
> >> & the .NET (managed) world... However it helps to define the methods &
> >> interfaces that you use first, as P/Invoke (how you define the method) is
> >> your first "defense" on converting unmanaged types.
> >>
> >>
> >> FWIW The name GetIDAsVariant, suggests it returns a COM Variant, a Google
> >> search reinforces this notion. I normally check www.pinvoke.net for the
> >> correct definitions of unmanaged interfaces & methods that I want to use
> >> in
> >> the managed world.
> >>
> >> --
> >> Hope this helps
> >> Jay B. Harlow
> >> .NET Application Architect, Enthusiast, & Evangelist
> >> T.S. Bradley - http://www.tsbradley.net
> >>
> >>
> >> "Serge BRIC" <(E-Mail Removed)> wrote in message
> >> news:0BE821CE-C60D-4438-BAAF-(E-Mail Removed)...
> >> > My application, written in .NET VB, tries to get a communication port
> >> > handle
> >> > from a TAPI object with this code:
> >> >
> >> > Dim vFileHandle As Byte() = appel.GetIDAsVariant("comm/datamodem")
> >> >
> >> > The vFileHandle is supposed to be a file handle (an IntPtr, I suppose).
> >> > How
> >> > can I convert this Byte() in this IntPtr ?
> >>
>