473,387 Members | 1,925 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

Handling with dementia

Nak
Hi there,

I am having great fun with Pointers or Handlers or whatever you want to
call them in VB.NET. WHat I am attempting to do is create a .NET image by
using the FreeImage library. On the site they clear say,

------------------------

How do I convert a FreeImage image to a HBITMAP ?

FIBITMAP *dib = FreeImage_Load(FIF_PNG, "test.png", PNG_DEFAULT);
HBITMAP bitmap = CreateDIBitmap(hDC, FreeImage_GetInfoHeader(dib),
CBM_INIT, FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS);

------------------------

Now I know that this is C++, but I thought this shouldn't be hard to
convert, surely? So I have written the following function in replacement to
the above

------------------------

Private Function getFreeImage(ByVal iFileName As String) As Image
Try

'create a FreeImage Wrapper and get a handle to the desired image

Dim pFIWImage As New freeImage_Wrapper()
Dim pIntFIHandle As Integer =
pFIWImage.FreeImage_Load(freeImage_Wrapper.FreeIma ge_GetFileType(iFileName,
0), iFileName, 0)

'Create a new DC that we can use with the CreateDIBitmap API

Dim pBmpBitmap As Bitmap = New
Bitmap(Convert.ToInt32(pFIWImage.FreeImage_GetWidt h(pIntFIHandle)),
Convert.ToInt32 (pFIWImage.FreeImage_GetHeight(pIntFIHandle)))
Dim pGraGraphics As Graphics = Graphics.FromImage(pBmpBitmap)
Dim pIPrHDC As IntPtr = pGraGraphics.GetHdc
'Convert the DIB to a DDB using the API CreateDIBitmap

Dim pBIHInfoHeader As BITMAPINFOHEADER =
pFIWImage.FreeImage_GetInfoHeader(pIntFIHandle)
Dim pIPrBits As IntPtr = pFIWImage.FreeImage_GetBits(pIntFIHandle)
Dim pBIoInfo As BITMAPINFO = pFIWImage.FreeImage_GetInfo(pIntFIHandle)
Dim pIntDDBHandle As Integer = CreateDIBitmap(pIPrHDC.ToInt32,
pBIHInfoHeader, CBM_INIT, pIPrBits, pBIoInfo, DIB_RGB_COLORS)

'Now we have a handle to a HBitmap we can create a .NET Image

Dim pImgImage As Image = Image.FromHbitmap(New IntPtr(pIntDDBHandle))

'Release the DC and unload the image

Call pGraGraphics.ReleaseHdc(pIPrHDC)
Call pFIWImage.FreeImage_Unload(pIntFIHandle)

'Return out image

Return (pImgImage)
Catch ex As Exception
MessageBox.Show(ex.ToString)
Return (Nothing)
End Try
End Function

------------------------

Now all I am getting out of this is 1 black pixel, no more, no less.
Why is this? I *think* it may have something to do with the way I am
passing the handle of the HBitmap to the FromHBitmap method, according the
MSDN a handle *is* returned by the API. Unfortunately seeing as my handle
is a 32 bit integer, I can't just pass it straight to the method, so I am
creating a new IntPtr object, which I *presume* creates a pointer to my
value, or doesn't it?

I must be so close to achieving what I want, yet this bit is confusing
me, if I display the value of "New IntPtr(pIntDDBHandle)" in a messagebox I
get the same value each time, so it can't be a pointer, can it? How the
hell can I do this? I have even tried using StretchDIBits to attempt to
blit the DIB onto my bitmap but still no luck :-(

Any help would be greatly appreciated, thanks loads in advance.
Nick.

--
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
"No matter. Whatever the outcome, you are changed."

Fergus - September 5th 2003
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Nov 20 '05 #1
7 2192
Instead of getting pointers in Integers, you should recieve them in IntPtr's

You'll also need to change the parameters to IntPtr's, where appropriate.
Anything that's a handle, or a pointer, should be IntPtr.

Declare Function FreeImage_Load(...) As IntPtr
Declare Function CreateDIBitmap(...) As IntPtr

Dim phImage As IntPtr = CreateDIBitmap(...)

Dim imgImage As Image = Image.FromHBitmap(phImage)

--
HTH,
-- Tom Spink, Über Geek

Please respond to the newsgroup,
so all can benefit

" System.Reflection Master "

==== Converting to 2002 ====
Remove inline declarations
"Nak" <a@a.com> wrote in message
news:Oe**************@TK2MSFTNGP11.phx.gbl...
Hi there,

I am having great fun with Pointers or Handlers or whatever you want to call them in VB.NET. WHat I am attempting to do is create a .NET image by
using the FreeImage library. On the site they clear say,

------------------------

How do I convert a FreeImage image to a HBITMAP ?

FIBITMAP *dib = FreeImage_Load(FIF_PNG, "test.png", PNG_DEFAULT);
HBITMAP bitmap = CreateDIBitmap(hDC, FreeImage_GetInfoHeader(dib),
CBM_INIT, FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS);
------------------------

Now I know that this is C++, but I thought this shouldn't be hard to
convert, surely? So I have written the following function in replacement to the above

------------------------

Private Function getFreeImage(ByVal iFileName As String) As Image
Try

'create a FreeImage Wrapper and get a handle to the desired image

Dim pFIWImage As New freeImage_Wrapper()
Dim pIntFIHandle As Integer =
pFIWImage.FreeImage_Load(freeImage_Wrapper.FreeIma ge_GetFileType(iFileName, 0), iFileName, 0)

'Create a new DC that we can use with the CreateDIBitmap API

Dim pBmpBitmap As Bitmap = New
Bitmap(Convert.ToInt32(pFIWImage.FreeImage_GetWidt h(pIntFIHandle)),
Convert.ToInt32 (pFIWImage.FreeImage_GetHeight(pIntFIHandle)))
Dim pGraGraphics As Graphics = Graphics.FromImage(pBmpBitmap)
Dim pIPrHDC As IntPtr = pGraGraphics.GetHdc
'Convert the DIB to a DDB using the API CreateDIBitmap

Dim pBIHInfoHeader As BITMAPINFOHEADER =
pFIWImage.FreeImage_GetInfoHeader(pIntFIHandle)
Dim pIPrBits As IntPtr = pFIWImage.FreeImage_GetBits(pIntFIHandle)
Dim pBIoInfo As BITMAPINFO = pFIWImage.FreeImage_GetInfo(pIntFIHandle)
Dim pIntDDBHandle As Integer = CreateDIBitmap(pIPrHDC.ToInt32,
pBIHInfoHeader, CBM_INIT, pIPrBits, pBIoInfo, DIB_RGB_COLORS)

'Now we have a handle to a HBitmap we can create a .NET Image

Dim pImgImage As Image = Image.FromHbitmap(New IntPtr(pIntDDBHandle))

'Release the DC and unload the image

Call pGraGraphics.ReleaseHdc(pIPrHDC)
Call pFIWImage.FreeImage_Unload(pIntFIHandle)

'Return out image

Return (pImgImage)
Catch ex As Exception
MessageBox.Show(ex.ToString)
Return (Nothing)
End Try
End Function

------------------------

Now all I am getting out of this is 1 black pixel, no more, no less.
Why is this? I *think* it may have something to do with the way I am
passing the handle of the HBitmap to the FromHBitmap method, according the
MSDN a handle *is* returned by the API. Unfortunately seeing as my handle
is a 32 bit integer, I can't just pass it straight to the method, so I am
creating a new IntPtr object, which I *presume* creates a pointer to my
value, or doesn't it?

I must be so close to achieving what I want, yet this bit is confusing
me, if I display the value of "New IntPtr(pIntDDBHandle)" in a messagebox I get the same value each time, so it can't be a pointer, can it? How the
hell can I do this? I have even tried using StretchDIBits to attempt to
blit the DIB onto my bitmap but still no luck :-(

Any help would be greatly appreciated, thanks loads in advance.
Nick.

--
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ "No matter. Whatever the outcome, you are changed."

Fergus - September 5th 2003
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Nov 20 '05 #2
Nak
Hi Tom,
Instead of getting pointers in Integers, you should recieve them in IntPtr's
You'll also need to change the parameters to IntPtr's, where appropriate.
Anything that's a handle, or a pointer, should be IntPtr.

Declare Function FreeImage_Load(...) As IntPtr
Declare Function CreateDIBitmap(...) As IntPtr

Dim phImage As IntPtr = CreateDIBitmap(...)

Dim imgImage As Image = Image.FromHBitmap(phImage)


I've just tried as suggested but still no luck. The wrapper for the
FreeImage library I am using strictly uses Int32 rather than Intptr anyway,
I have tried using pointers but this hasn't effected it, I'm still getting 1
black pixel for any image.

This is what my function looks like at the moment,

-------------------------------------

Private Function getFreeImage(ByVal iFileName As String) As Image
Try

'Create a Free Image wrapper object and then load the image,
recieving an IntPtr

Dim pFIWImage As New freeImage_Wrapper()
Dim pIntFIHandle As IntPtr =
pFIWImage.FreeImage_Load(freeImage_Wrapper.FreeIma ge_GetFileType(iFileName,
0), iFileName, 0)
Dim pBmpBitmap As Bitmap = New
Bitmap(Convert.ToInt32(pFIWImage.FreeImage_GetWidt h(pIntFIHandle)),
Convert.ToInt32(pFIWImage.FreeImage_GetHeight(pInt FIHandle)))

'Create a new comatible DC using the Framework, rather than Windows
API's

Dim pGraGraphics As Graphics = Graphics.FromImage(pBmpBitmap)
Dim pIPrHDC As IntPtr = pGraGraphics.GetHdc

'Get the parts of the image needed to create a DDB as IntPtr's

Dim pBIHInfoHeader As IntPtr =
pFIWImage.FreeImage_GetInfoHeader(pIntFIHandle)
Dim pIPrBits As IntPtr = pFIWImage.FreeImage_GetBits(pIntFIHandle)
Dim pBIoInfo As IntPtr = pFIWImage.FreeImage_GetInfo(pIntFIHandle)

'Create a DDB

Dim pIntHBitmap As IntPtr = CreateDIBitmap(pIPrHDC.ToInt32,
pBIHInfoHeader, CBM_INIT, pIPrBits, pBIoInfo, DIB_RGB_COLORS)

'Convert into a .NET image

Dim pImgImage As Image = Image.FromHbitmap(pIntHBitmap)

'Release the DC and unload the image

Call pGraGraphics.ReleaseHdc(pIPrHDC)
Call pFIWImage.FreeImage_Unload(pIntFIHandle)

'Return the .NET image

Return (pImgImage)
Catch ex As Exception
MessageBox.Show(ex.ToString)
Return (Nothing)
End Try
End Function

-------------------------------------

I'm slightly confused as to how you can actually change the signature of an
API call? I notice on MSDN with reference to CreateDIBitmap that it uses
pointers int the call, hence I am using IntPtr's in the declaration, for
example

Private Declare Function CreateDIBitmap Lib "gdi32.dll" (ByVal hdc As Int32,
ByRef lpInfoHeader As IntPtr, ByVal dwUsage As Int32, ByRef lpInitBits As
IntPtr, ByRef lpInitInfo As IntPtr, ByVal wUsage As Int32) As IntPtr

On MSDN it says that the return value is a handle to the HBitmap if
successful, I am getting a returned value every time without fail, but it is
allways the same value, if I use Err.LastDLLError I get code 8, not that I
know what that means exactly.

I haven't actually found any examples anywhere of CreateDIBitmap being used
in VB.NET. If this cannot be achieved in VB.NET I do not mind using C#,
after all it is only a tiny plugin that I am creating which wraps the
FreeImage library. Thanks for your help Tom, I shall keep trying different
deformations of data types.

Nick.

--
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
"No matter. Whatever the outcome, you are changed."

Fergus - September 5th 2003
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Nov 20 '05 #3
Nak
Hi again,

I have just made a discovery, I get the same 1 black pixel if I pass
zero pointers to the CreateDIBitmap function, so surely it must be the way
the data is being passed. I can't see that what I am doing is that wrong,
surely?

-------------------

FIBITMAP *dib = FreeImage_Load(FIF_PNG, "test.png", PNG_DEFAULT);
HBITMAP bitmap = CreateDIBitmap(hDC, FreeImage_GetInfoHeader(dib),
CBM_INIT, FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS);

-------------------

Referring to the above, FIBITMAP is of Int32 type, simply aliased.
According to the C# wrapper FreeImage_GetInfoHeader returns the correct data
type for the API, so does FreeImage_GetInfo. FreeImageGetBits on the other
hand returns an Int32, which I *presume* is a pointer to an array, which
surely I could get to by using new IntPtr(address) ?

More deformations needed I think!

Nick.

--
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
"No matter. Whatever the outcome, you are changed."

Fergus - September 5th 2003
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Nov 20 '05 #4
> strictly uses Int32

I don't understand, what do you mean, strictly? If the C++ function is
FIBITMAP*, then it's a pointer...

--
HTH,
-- Tom Spink, Über Geek

Please respond to the newsgroup,
so all can benefit

" System.Reflection Master "

==== Converting to 2002 ====
Remove inline declarations
"Nak" <a@a.com> wrote in message
news:e$*************@TK2MSFTNGP10.phx.gbl...
Hi Tom,
Instead of getting pointers in Integers, you should recieve them in IntPtr's

You'll also need to change the parameters to IntPtr's, where appropriate. Anything that's a handle, or a pointer, should be IntPtr.

Declare Function FreeImage_Load(...) As IntPtr
Declare Function CreateDIBitmap(...) As IntPtr

Dim phImage As IntPtr = CreateDIBitmap(...)

Dim imgImage As Image = Image.FromHBitmap(phImage)


I've just tried as suggested but still no luck. The wrapper for the
FreeImage library I am using strictly uses Int32 rather than Intptr

anyway, I have tried using pointers but this hasn't effected it, I'm still getting 1 black pixel for any image.

This is what my function looks like at the moment,

-------------------------------------

Private Function getFreeImage(ByVal iFileName As String) As Image
Try

'Create a Free Image wrapper object and then load the image,
recieving an IntPtr

Dim pFIWImage As New freeImage_Wrapper()
Dim pIntFIHandle As IntPtr =
pFIWImage.FreeImage_Load(freeImage_Wrapper.FreeIma ge_GetFileType(iFileName, 0), iFileName, 0)
Dim pBmpBitmap As Bitmap = New
Bitmap(Convert.ToInt32(pFIWImage.FreeImage_GetWidt h(pIntFIHandle)),
Convert.ToInt32(pFIWImage.FreeImage_GetHeight(pInt FIHandle)))

'Create a new comatible DC using the Framework, rather than Windows API's

Dim pGraGraphics As Graphics = Graphics.FromImage(pBmpBitmap)
Dim pIPrHDC As IntPtr = pGraGraphics.GetHdc

'Get the parts of the image needed to create a DDB as IntPtr's

Dim pBIHInfoHeader As IntPtr =
pFIWImage.FreeImage_GetInfoHeader(pIntFIHandle)
Dim pIPrBits As IntPtr = pFIWImage.FreeImage_GetBits(pIntFIHandle)
Dim pBIoInfo As IntPtr = pFIWImage.FreeImage_GetInfo(pIntFIHandle)

'Create a DDB

Dim pIntHBitmap As IntPtr = CreateDIBitmap(pIPrHDC.ToInt32,
pBIHInfoHeader, CBM_INIT, pIPrBits, pBIoInfo, DIB_RGB_COLORS)

'Convert into a .NET image

Dim pImgImage As Image = Image.FromHbitmap(pIntHBitmap)

'Release the DC and unload the image

Call pGraGraphics.ReleaseHdc(pIPrHDC)
Call pFIWImage.FreeImage_Unload(pIntFIHandle)

'Return the .NET image

Return (pImgImage)
Catch ex As Exception
MessageBox.Show(ex.ToString)
Return (Nothing)
End Try
End Function

-------------------------------------

I'm slightly confused as to how you can actually change the signature of an API call? I notice on MSDN with reference to CreateDIBitmap that it uses
pointers int the call, hence I am using IntPtr's in the declaration, for
example

Private Declare Function CreateDIBitmap Lib "gdi32.dll" (ByVal hdc As Int32, ByRef lpInfoHeader As IntPtr, ByVal dwUsage As Int32, ByRef lpInitBits As
IntPtr, ByRef lpInitInfo As IntPtr, ByVal wUsage As Int32) As IntPtr

On MSDN it says that the return value is a handle to the HBitmap if
successful, I am getting a returned value every time without fail, but it is allways the same value, if I use Err.LastDLLError I get code 8, not that I
know what that means exactly.

I haven't actually found any examples anywhere of CreateDIBitmap being used in VB.NET. If this cannot be achieved in VB.NET I do not mind using C#,
after all it is only a tiny plugin that I am creating which wraps the
FreeImage library. Thanks for your help Tom, I shall keep trying different deformations of data types.

Nick.

--
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ "No matter. Whatever the outcome, you are changed."

Fergus - September 5th 2003
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Nov 20 '05 #5
Nak
Hi Tom,
I don't understand, what do you mean, strictly? If the C++ function is
FIBITMAP*, then it's a pointer...


What I am saying is that the API's signature should be written correctly,
the FreeImage library returns complete classes containing the Bitmap Header
data, and not pointers too, if I go changing the signature so it returns a
pointer it isn't going to change the underlying code!!

What I need to be able to do is get the required information from the
FreeImage API's and pass a pointer to the relevant data to the API, which I
presumed was ByRef but I am not so sure if it is treated the same in C++.

I know full well that if the API description contains a * that it is a
pointer, but in VB.NET you can't just make pointers to objects, or can you?
ByRef isn't technically the same, or is it?

I have made a C# version of exactly the same thing and it still doesn't
work, it seems to me that CreateDIBitmap might not be compatible with .NET,
I haven't found one example of this FreeImage library being used in .NET nor
CreateDIBitmap. Maybe C++ .NET, that should have no problems surely?

Fun fun fun

Nick.

--
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
"No matter. Whatever the outcome, you are changed."

Fergus - September 5th 2003
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Nov 20 '05 #6
Nak
All working!!!

I stuck with the C# version and kept trying many different combinations, I
eventually didn't pass anything by reference and the only pointer that was
passed was for the bitmap bits.

Talk about look of shock on my face when the thing actually worked! I
thought I was flogging a dead badger with a pastrami!!

Nick.

--
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
"No matter. Whatever the outcome, you are changed."

Fergus - September 5th 2003
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Nov 20 '05 #7
Nak
Weyhey now working in VB.NET!

Loads of types now!

Nick.

--
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
"No matter. Whatever the outcome, you are changed."

Fergus - September 5th 2003
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Nov 20 '05 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: WSeeger | last post by:
When creating a new class, is it encouraged to always include error handling routines within your LET and GET procedures? It's seems that most text books never seem to include much about error...
9
by: Hans-Joachim Widmaier | last post by:
Hi all. Handling files is an extremely frequent task in programming, so most programming languages have an abstraction of the basic files offered by the underlying operating system. This is...
3
by: Master of C++ | last post by:
Hi, I am an absolute newbie to Exception Handling, and I am trying to retrofit exception handling to a LOT of C++ code that I've written earlier. I am just looking for a bare-bones, low-tech...
21
by: Anthony England | last post by:
Everyone knows that global variables get re-set in an mdb when an un-handled error is encountered, but it seems that this also happens when the variable is defined as private at form-level. So...
3
by: Stefan Johansson | last post by:
Hi all I'am moving from Visual Foxpro and have a question regarding "best practice" error handling in vb .net. In VFP I have always used a "central" error handling object in order to have a...
4
by: Al Williams | last post by:
Hi, I have error handling in place throughout my application. I also start the application wrapped in error handling code to catch any unexpected exceptions (i.e. exceptions that occur where I...
9
by: Gustaf | last post by:
I'm confused about structured error handling. The following piece of code is a simplification of a class library I'm working on. It works, and it does what I want, but I'm still not convinced that...
7
by: yogeshnelwadkar | last post by:
Hello, i have a problem with replacing c++ exception handling with structured exception handling. How to replace the " catch(...) " in c++ exception handling with, __except , a structured...
41
by: Zytan | last post by:
Ok something simple like int.Parse(string) can throw these exceptions: ArgumentNullException, FormatException, OverflowException I don't want my program to just crash on an exception, so I must...
0
by: Lysander | last post by:
Thought I would give something back with a few articles. This article is a bit of code to add error handling. When I have time, I want to write articles on multilingual databases, and Access...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.