Question

Rotate and Resize a Picture on any Windows OS

Asked by: mdougan

I have a program written in VB6.  I'm adding a form where the user will manipulate the picture in a picture box control.  Sometimes, the program draws a picture in the picture box, sometimes the user will elect to load a BMP, JPG or GIF into the picturebox.

When the image is drawn or loaded into the picture box, it is automatically sized to fit the widest dimension (width or height).

Then, the user can manipulate a slider that rotates the picture in the picture box by any increment of degrees.

I'd hacked together a clsBitmap I'd found online, with some other code to do the rotation and I'd gotten this function working under Windows 2000, but found that it did not work under Windows XP.  I also see that I've used one Windows API that is not available under Windows 95.  I believe that Microsoft changed the signature of some basic Windows API functions, and/or redefined types such as BITMAPBASEINFO which is used by several of the API calls.

I'd like to be able to use this function on any OS, without having to jump through hoops checking what version of the OS is being used, and using different API declarations accordingly.  I would consider this option, though, as a last resort.

My needs are pretty simple in nature (though maybe not in implementation)... I need to be able to take a standard Picture object, reference it's height and width in pixels, resize it and rotate it, under any version of Windows.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2008-09-11 at 11:30:45ID23724096
Tags

VB 6

,

Picture Resize and Rotation

,

rotate

,

picture

,

resize

,

windows

,

any

Topics

Visual Basic Programming

,

Windows 2000 Operating System

,

Windows XP Operating System

Participating Experts
2
Points
500
Comments
9

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. gif rotation
    I can create animated gifs by stringing together images using a gif animator, but what I am looking for is a technique to create the frames. I want to rotate an image as if it is spinning either on a vertical axis or a horizontal one - i.e. in 3D, but all I can do in Photosh...
  2. Converting *.bmp to *.jpg or *.gif
    Anyone know how to convert a bitmap to jpg or gif format?
  3. Rotate a JPG image
    I need to rotate a Jpeg image 90, 180, and 270 degrees. I am using a TImage control with TJPEGImage to show the Jpeg. I can't just rotate the Bitmap because a jpeg in TImage does not have a Bitmap. Please provide the code. If possible I would also like to be able to ro...
  4. Simple JPG rotation?
    I need to rotate a JPEG image 90, 180, or 270 degrees WITHOUT CHANGING THE IMAGE QUALITY! I have a working piece of code that converts a JPG to BMP, rotates it, then changes it back to JPG; however, this results in quality loss (or at least a bigger file size than necessary)...
  5. rotating jpg files?
    when i rotate images taken with my digital camera (JPGs) for 90 deg. and save then they become smaller. i suppose they lose quality. for example, if original file is 500KB then rotated one becomes 170KB. So, my question is: how to rotate JPG without loosing any quality(file s...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: c0ldfyr3Posted on 2008-09-11 at 11:56:25ID: 22453315

Hey, try looking at the examples on www.pscode.com/vb search for picture or bitmap, there's a lot of examples to choose from :)

 

by: mdouganPosted on 2008-09-11 at 13:55:00ID: 22454700

Yea, Project Source Code is where I think I got the original class sample I was using... that sample could resize a picture but not rotate it, and then I found another example that could do the rotation, and managed to get them both to work.  But, they wouldn't work under XP.

I just went back and found a different example that has the rotate and resize in the same class... I compiled it under Win 2000 and it works there, and then tried installing the test program on XP and it does work there as well.  So, that might solve the problem.  Give me a few days to try to port that to the application and I'll let you know if it works!  Thanks!

 

by: FentonEngPosted on 2008-09-16 at 19:10:31ID: 22494924

I have a hunch that it is using a specific version of the BITMAPINFOHEADER structure, which is why it may be failing on another windows version. Unless there is a particular "exotic" function call in there somewhere!

http://msdn.microsoft.com/en-us/library/ms532290.aspx

This *shouldn't* really cause a problem if it is used correctly, but It does seem to match your pattern of errors.

 

by: mdouganPosted on 2008-09-17 at 07:12:16ID: 22498836

Yes, I'm using the oldest version of the BITMAPINFOHEADER  (prior to V4 or V5).  

But what is a little strange is that I'm passing this structure to the functions GetDIBits, CreateDIBSection and SetDIBitsToDevice rather than a BITMAPINFO structure which contains both a BITMAPINFOHEADER and and RGBQUAD structure.  This seems to work fine on a Windows 2000 machine, but not at all on XP.  I'm a little surprised that it works at all (I got this from someone else's sample), given that I'm not passing the structure that it should be expecting.

 

by: mdouganPosted on 2008-09-17 at 11:51:05ID: 22502287

I cleaned up the code a bit so that all the proper structures are being passed... Under Windows XP, now, I do get some image data, but it is messed up... however, under Windows 2000 it works fine.  Here is the stripped down code that will read a JPG file into this clsBitmap through the LET Picture property, then, the clsBitmap's Picture property is used to populate a form's PictureBox.Picture using the GET Picture property.  In the real application, I also do some resizing and rotation, but I'll worry about that once I get the image to display under XP.

Anyone see anything in the following code that will work under W2000 but not XP?

Create a VB6 application with a form, a picturebox and a command button, then paste this code into the form, changing the reference to the jpg to some jpg that you have on your computer.

Private Sub Command1_Click()
Dim oSaveBit As clsBitmap

            Set oSaveBit = New clsBitmap
            oSaveBit.Picture = LoadPicture("firstfloor.jpg")
            Set Picture1.Picture = oSaveBit.Picture

End Sub

Then, copy/paste the code snippet into a new Class module that you call clsBitmap,

Option Explicit
 
Private Const LR_COPYRETURNORG = &H4
Private Const RGN_XOR = &H3
 
Private Type Bitmap
    Type As Long
    Width As Long
    Height As Long
    WidthBytes As Long
    Planes As Integer
    BitsPixel As Integer
    Bits As Long
End Type
 
Private Type BITMAPINFOHEADER
    Size As Long
    Width As Long
    Height As Long
    Planes As Integer
    BitCount As Integer
    Compression As Long
    SizeImage As Long
    XPelsPerMeter As Long
    YPelsPerMeter As Long
    ClrUsed As Long
    ClrImportant As Long
End Type
 
Private Type RGBQUAD
        rgbBlue As Byte
        rgbGreen As Byte
        rgbRed As Byte
        rgbReserved As Byte
End Type
 
Private Type BITMAPINFO
        bmiHeader As BITMAPINFOHEADER
        bmiColors As RGBQUAD
End Type
 
Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type
 
Private Type PicBmpBase
    Size As Long
    Type As Long
    hBMP As Long
    hPal As Long
    hReserved As Long
End Type
 
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function CreateDIBSection Lib "gdi32" (ByVal hDC As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, ByRef lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
Private Declare Function GetDIBits Lib "gdi32" (ByVal hDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function SetDIBitsToDevice Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal Scan As Long, ByVal NumScans As Long, Bits As Any, BitsInfo As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
 
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function CopyImage Lib "user32" (ByVal handle As Long, ByVal imageType As Long, ByVal NewWidth As Long, ByVal NewHeight As Long, ByVal lFlags As Long) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmpBase, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
 
Private mBits() As Byte ' DIB bits buffer
Private mHeight As Long ' Height
Private mWidth As Long ' Width
Private mScanX As Integer ' Extra bytes per scan line
Private mRgn As Long ' Region pointer
 
Public Property Let Picture(vData As Picture)
    Dim vBMP As Bitmap ' Basic image info
    Dim lBmp As Long ' Copy of image
    Dim lDC As Long ' Temporary device context
    Dim vBMI As BITMAPINFO ' Basic DIB info
      On Error GoTo ErrorRtn
 
    ' Reset
    Erase mBits
    mWidth = 0
    mHeight = 0
    Me.DeleteRegion
    
    Call GetObject(vData.handle, Len(vBMP), vBMP) ' Get bitmap info
    If (vBMP.Width > 0) And (vBMP.Height > 0) Then
        lBmp = CopyImage(vData.handle, 0, 0, 0, LR_COPYRETURNORG) ' Create temp copy
        lDC = CreateCompatibleDC(0) ' Create temp device context
        Call SelectObject(lDC, lBmp) ' Select image into temp dc
        vBMI.bmiHeader.Size = Len(vBMI.bmiHeader) ' Set up for image
        Call GetDIBits(lDC, lBmp, 0, vBMP.Height, ByVal 0&, vBMI, 0) ' Get DIB info
 
        If vBMI.bmiHeader.Width = vBMP.Width And vBMI.bmiHeader.BitCount >= 24 Then ' Check for validity
            ReDim mBits(vBMI.bmiHeader.SizeImage - 1) ' Allocate buffer
            Call GetDIBits(lDC, lBmp, 0, vBMI.bmiHeader.Height, mBits(0), vBMI, 0) ' Get bits
            mWidth = vBMI.bmiHeader.Width ' Store width
            mHeight = vBMI.bmiHeader.Height ' Store height
            mScanX = ((vBMI.bmiHeader.SizeImage - (mWidth * mHeight * 3)) / mHeight) Mod mWidth ' Count extra bytes
        Else
           MsgBox "Invalid Bitcount"
        End If
        Call DeleteObject(lBmp) ' Delete temp image
        Call DeleteDC(lDC) ' Delete temp dc
    End If
    
    GoTo ExitRtn
 
ErrorRtn:
    DisplayError "clsBitmap.Let Picture", Err.Number, Err.Description
 
ExitRtn:
 
 
End Property
 
Public Property Get Picture() As Picture
    Dim lDC As Long ' Temporary device context
    Dim vBMI As BITMAPINFO ' Basic DIB info
    Dim lBmp As Long ' Copy of image
    Dim vIDispatch As GUID ' IIDispatch GUID
    Dim vPic As PicBmpBase ' OLE picture info
    Dim lReturn As Long
    
    On Error GoTo ErrorRtn
    
    
    If StrPtr(mBits) <> 0 Then ' Check for bits
        lDC = CreateCompatibleDC(0) ' Create temp dc
        
        With vBMI.bmiHeader ' Set up for image
            .BitCount = 24
            .Planes = 1
            .Width = mWidth
            .Height = mHeight
            .SizeImage = UBound(mBits) + 1
            .Size = Len(vBMI.bmiHeader)
        End With
        lBmp = CreateDIBSection(lDC, vBMI, 0, 0, 0, 0) ' Create a temp blank image
        
        Call SelectObject(lDC, lBmp) ' Select image into temp DC
                
        Call SetDIBitsToDevice(lDC, 0, 0, mWidth, mHeight, 0, 0, 0, mHeight, mBits(0), vBMI, 0) ' Set bits
                
        With vIDispatch ' Setup for IIDispatch
            .Data1 = &H20400
            .Data4(0) = &HC0
            .Data4(7) = &H46
        End With
        
        
        With vPic ' Setup for new picture
            .Size = Len(vPic)
            .Type = vbPicTypeBitmap
            .hBMP = lBmp
            .hPal = 0&
        End With
        
        Call OleCreatePictureIndirect(vPic, vIDispatch, 1, Picture) ' Convert image to OLE picture
    
        Call DeleteDC(lDC) ' Delete temp dc
    Else
        MsgBox "NoBits"
    End If
    
    
    GoTo ExitRtn
 
ErrorRtn:
    DisplayError "clsBitmap.Get Picture", Err.Number, Err.Description
 
ExitRtn:
 
 
End Property
 
Public Property Let Bits(vData() As Byte)
    mBits = vData
End Property
Public Property Get Bits() As Byte()
    Bits = mBits
End Property
 
Public Property Get Width() As Long
    Width = mWidth
End Property
 
Public Property Get Height() As Long
    Height = mHeight
End Property
 
Public Sub DeleteRegion()
    If mRgn <> 0 Then ' Check for region
        Call DeleteObject(mRgn) ' Delete region
        mRgn = 0 ' Clear pointer
    End If
End Sub
 
Private Sub DisplayError(sProcName As String, Optional vErrNo, Optional vErrDesc)
Dim sErrors As String
Dim lMouse As Long
    On Error Resume Next
 
    lMouse = Screen.MousePointer
    Screen.MousePointer = Default
    sErrors = sProcName
    sErrors = sErrors & vbCrLf & vErrNo & "-" & vErrDesc
    MsgBox sErrors, vbCritical, sProcName
    Screen.MousePointer = lMouse
    
End Sub
 
Private Sub Class_Terminate()
    Erase mBits ' Empty buffer
    Me.DeleteRegion ' Delete region, if any
End Sub
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:

Select allOpen in new window

 

by: FentonEngPosted on 2008-09-20 at 04:26:34ID: 22529216

If you could step through your code with a debugger (or attach one to the process) and find out where it failed, it would be a big help. If you can't do that, add msgbox calls in before and after your win32 functions so you *know* where it went wrong

The following functions have special notes or behaviours in different OSs.

GetDIBits http://msdn.microsoft.com/en-us/library/ms532334(VS.85).aspx

SetDIBitsToDevice http://msdn.microsoft.com/en-us/library/ms532346(VS.85).aspx

It could be a situation where the parameters or return values have different meanings. This does crop up from time to time with XP specific coding.

 

by: mdouganPosted on 2008-09-20 at 07:07:20ID: 22529677

Yea, that's the difficulty.  I only have VB6 installed on the W2000 machine, and it works fine there.  I'm in the process of doing the message box debugging, but, it is slow going!  I'd actually done the debugging a long while back, when I first discovered the problem, but, I hadn't taken any notes, so, it is back to square one.  

I believe at the time, it was the GetDIBits that was failing, but that might have been because I wasn't passing the correct structure to the function.  I got no image data back from the call back then.

Now that I've cleaned up the structures, I am getting image data back, but when I setDIBitsToDevice, the pixels seem kind of spread out (under XP but not 2000).  So, I suspect that something is different in the number of bits, or the number of planes, and if that is the case, then perhaps the array of bytes has to have a different level of dimensions?  

If I put in enough message boxes, I'll eventually work it out.  Was just hoping someone had gone through this before!

Give me another day or two and I'll award this question, thanks!

 

by: mdouganPosted on 2008-09-21 at 12:03:41ID: 22535749

Success!  Here is what I discovered, FentonEng suggested I look more closely at the BITMAPINFOHEADER I was passing to the various API calls.  I found that I was not passing the complete structure for the BITMAPINFO structure.  This structure contains two members, the BITMAPINFOHEADER and an RGBQUAD structure.  I was only passing the BITMAPINFOHEADER, so, I made that correction and it seemed to solve my resize and rotate problems.  

It turns out there there are different versions of the BITMAPINFOHEADER that you can pass, depending on the OS version that you are running.  The oldest version is BITMAPINFOHEADER which can be used on all versions of windows.  V4 can be used on W95 and W2000 and V5 is for XP and above.  Since I didn't need to use any of the extra info in the later versions, I stuck with the oldest one for the greatest compatibility.

Though my resize and rotate appeared to be working, the image was not displaying correctly under Windows XP.  The data was there, but it was not being decoded correctly into the picturebox for display.

I put message boxes in to display every value of every structure both before and after calling the GetDIBits and SetDIBitsToDevice calls and found that the original bitmap that I was reading in had 24 bits per pixel, and the copy of the bitmap that I created in memory ended up with 32 and a compression flag of 3.  But, this only happened under Windows XP.  In Windows 2000, the copy of the bitmap had the same bits and compression that the original bitmap had.

I had to scratch my head for a while, but then I looked at the API call that I was using to copy the bitmap, which is CopyImage.  There are various flags that can be passed, and I was passing LR_COPYRETURNORG.  I read that there was a different flag I could pass that is LR_CREATEDIBSECTION and it said that this was the only option that would return a Device Independent Bitmap.  

So, now it made sense... though all my other code was trying to work with a DIB, the copy of the bitmap I was making was actually device dependent.  So, under Windows 2000, it worked, because the device (my screen resolution and color depth most likely) was set to the same 24 bits per pixel as the bitmap I was loading in.  But, under Windows XP (newer computer, higher res screen, more color depth) that device didn't match.

So, switching the flag to LR_CREATEDIBSECTION solved the final problem.

Since FentonEng's advice eventually let me to it, I'll award it to him.  Thanks guys!

 

by: mdouganPosted on 2008-09-21 at 12:04:44ID: 31649731

Thanks alot!

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...