PC Review


Reply
Thread Tools Rate Thread

How to convert a Byte() to an IntPtr in VB

 
 
=?Utf-8?B?U2VyZ2UgQlJJQw==?=
Guest
Posts: n/a
 
      16th Oct 2006
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 ?
 
Reply With Quote
 
 
 
 
=?Utf-8?B?U2VyZ2UgQlJJQw==?=
Guest
Posts: n/a
 
      16th Oct 2006
Sorry for this double message (I thought the previous one had failed).
 
Reply With Quote
 
TDC
Guest
Posts: n/a
 
      16th Oct 2006
The Marshal class (in System.Runtime.Interop) has mothods to convert
(copy actually) to and from unmanaged memory. If you browse the
methods there, you'll quickly find what you are looking for in response
to this and your other similar posted question.

Tom


Serge BRIC wrote:
> 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 ?


 
Reply With Quote
 
=?Utf-8?B?U2VyZ2UgQlJJQw==?=
Guest
Posts: n/a
 
      17th Oct 2006
I have obtained the TAPI3 file handle with VB and C++ code, like this:

Dim vFileHandle As Byte() = appel.GetIDAsVariant("comm/datamodem")
Dim iFileHandle As IntPtr
iFileHandle = BytePtr2Handle(vFileHandle)

The C++ BytePtr2Handle() is :

__declspec(dllexport) HANDLE BytePtr2Handle(BYTE* p)
{
return *((LPHANDLE)p);
}

I'm certain it could be done, in a simpler way, in VB (without C++ code) but
I don't know how.

"TDC" wrote:

> The Marshal class (in System.Runtime.Interop) has mothods to convert
> (copy actually) to and from unmanaged memory. If you browse the
> methods there, you'll quickly find what you are looking for in response
> to this and your other similar posted question.
>
> Tom
>
>
> Serge BRIC wrote:
> > 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 ?

>
>

 
Reply With Quote
 
Jay B. Harlow
Guest
Posts: n/a
 
      17th Oct 2006
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 ?


 
Reply With Quote
 
=?Utf-8?B?U2VyZ2UgQlJJQw==?=
Guest
Posts: n/a
 
      17th Oct 2006
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 ?

>

 
Reply With Quote
 
Jay B. Harlow
Guest
Posts: n/a
 
      17th Oct 2006
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 ?

>>


 
Reply With Quote
 
=?Utf-8?B?U2VyZ2UgQlJJQw==?=
Guest
Posts: n/a
 
      18th Oct 2006
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 ?
> >>

>

 
Reply With Quote
 
Jay B. Harlow
Guest
Posts: n/a
 
      18th Oct 2006
Serge,
I know what it is. :-|

I wanted to see your VB.NET definition of ITLegacyCallMediaControl2!

I wanted to make sure you had that defined correctly...

--
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:C098F5A6-1C85-4665-8A0C-(E-Mail Removed)...
> 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 ?
>> >>

>>


 
Reply With Quote
 
 
 
Reply

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How to convert Byte[] to IntPtr =?Utf-8?B?U2VyZ2UgQlJJQw==?= Microsoft VB .NET 0 16th Oct 2006 09:14 AM
Get IntPtr for a byte array Logan McKinley Microsoft C# .NET 2 31st Aug 2003 08:37 PM
Converting IntPtr to byte[] Brian Harleton Microsoft Dot NET 1 13th Aug 2003 09:26 PM
Converting IntPtr to byte[] Brian Harleton Microsoft C# .NET 2 13th Aug 2003 07:07 PM
How to convert between an IntPtr and a byte[]? Dave Microsoft Dot NET Framework 1 13th Aug 2003 05:09 PM


Features
 

Advertising
 

Newsgroups
 


All times are GMT +1. The time now is 07:39 AM.