|
web
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
How to convert a Byte() to an IntPtr in VBMy 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 ? Sorry for this double message (I thought the previous one had failed).
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: Show quoteHide quote > 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 ? 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. Show quoteHide quote "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 ? > > 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. -- Show quoteHide quoteHope this helps Jay B. Harlow ..NET Application Architect, Enthusiast, & Evangelist T.S. Bradley - http://www.tsbradley.net "Serge BRIC" <SergeB***@discussions.microsoft.com> wrote in message news:0BE821CE-C60D-4438-BAAF-5E876666E541@microsoft.com... > 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 ? 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. Show quoteHide quote "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" <SergeB***@discussions.microsoft.com> wrote in message > news:0BE821CE-C60D-4438-BAAF-5E876666E541@microsoft.com... > > 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 ? > 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? -- Show quoteHide quoteHope this helps Jay B. Harlow ..NET Application Architect, Enthusiast, & Evangelist T.S. Bradley - http://www.tsbradley.net "Serge BRIC" <SergeB***@discussions.microsoft.com> wrote in message news:BAEF8A64-1BDF-4D86-9340-B2B5A4E975A9@microsoft.com... > 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" <SergeB***@discussions.microsoft.com> wrote in message >> news:0BE821CE-C60D-4438-BAAF-5E876666E541@microsoft.com... >> > 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 ? >> 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 ... Show quoteHide quote "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" <SergeB***@discussions.microsoft.com> wrote in message > news:BAEF8A64-1BDF-4D86-9340-B2B5A4E975A9@microsoft.com... > > 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" <SergeB***@discussions.microsoft.com> wrote in message > >> news:0BE821CE-C60D-4438-BAAF-5E876666E541@microsoft.com... > >> > 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 ? > >> > 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... -- Show quoteHide quoteHope this helps Jay B. Harlow ..NET Application Architect, Enthusiast, & Evangelist T.S. Bradley - http://www.tsbradley.net "Serge BRIC" <SergeB***@discussions.microsoft.com> wrote in message news:C098F5A6-1C85-4665-8A0C-ECC323E70783@microsoft.com... > 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" <SergeB***@discussions.microsoft.com> wrote in message >> news:BAEF8A64-1BDF-4D86-9340-B2B5A4E975A9@microsoft.com... >> > 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 >> >> 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" <SergeB***@discussions.microsoft.com> wrote in message >> >> news:0BE821CE-C60D-4438-BAAF-5E876666E541@microsoft.com... >> >> > 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 ? >> >> >>
load form in vb.net
How to raise a shortcut picking off each digit of an integer Need help updating my dataset with changes made on the Source? Getchanges Merge? How to use binary files as resources in VB 2005 Re: What .NET classes are SLOW vs. API? control array with code added controls Getting external IP Address vb.net database programming Code Snippet Manager |
|||||||||||||||||||||||