Results 1 to 20 of 20

Thread: keep cdrom close

  1. #1

    Thread Starter
    Lively Member
    Join Date
    Apr 2005
    Posts
    112

    keep cdrom close

    don't want my friends to install AOL and crap on my computer

    using a timer_tick event how can i do this

    a timer checks every second if the cdrom drive is open if so it closes it

    please help
    i have to go to class in like a hour

  2. #2
    Frenzied Member moinkhan's Avatar
    Join Date
    Jun 2000
    Location
    Karachi, Pakistan
    Posts
    2,011

    Re: keep cdrom close

    Quote Originally Posted by student_devry01
    don't want my friends to install AOL and crap on my computer

    using a timer_tick event how can i do this

    a timer checks every second if the cdrom drive is open if so it closes it

    please help
    i have to go to class in like a hour

    make your life easy... change the computer's password

  3. #3

    Thread Starter
    Lively Member
    Join Date
    Apr 2005
    Posts
    112

    Re: keep cdrom close

    i really need this code

    how do i check to see if the cdrom door is open and if so close it

    please help???????

  4. #4
    Hyperactive Member gjon's Avatar
    Join Date
    Nov 2004
    Location
    Inescapable Void
    Posts
    442

    Re: keep cdrom close

    You could get a proggy called deep freeze that will allow other people to use your computer and keep them from changing many controls/programs and whathaveyous within it.

  5. #5
    Fanatic Member uniquegodwin's Avatar
    Join Date
    Jul 2005
    Location
    Chennai,India
    Posts
    694

    Re: keep cdrom close

    Hi student_devry...
    I came close to finding it..
    but,Im getting an error...
    heres what i tried for you..
    VB Code:
    1. Declare Function mciSendString Lib "winmm.dll" (ByVal command As String, _
    2.     ByVal buffer As StringBuilder, ByVal bufferSize As Int32, _
    3.     ByVal hwndCallback As IntPtr) As Int32
    4.  
    5.  
    6.     Dim returnstring As New StringBuilder
    7.  
    8.  
    9.  
    10.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11.         mciSendString("set CDAudio door open", returnstring, 127, IntPtr.Zero)
    12.     End Sub

    The error it gives me while running is this..
    Code:
    An unhandled exception of type 'System.EntryPointNotFoundException' occurred in WindowsApplication14.exe
    
    Additional information: Unable to find an entry point named mciSendString in DLL winmm.dll.
    I really wish someone helps after this point...why am I getting this error??
    Godwin

    Help someone else with what someone helped you!

  6. #6
    Fanatic Member uniquegodwin's Avatar
    Join Date
    Jul 2005
    Location
    Chennai,India
    Posts
    694

    Re: keep cdrom close

    Closing the cdrom door is also just set cdaudio door closed.
    But,I really dont know why what ive tried doesnt work.Ill be glad if someone gives me a hand.Im also interested in knowing how to do this.
    Godwin

    Help someone else with what someone helped you!

  7. #7
    Fanatic Member uniquegodwin's Avatar
    Join Date
    Jul 2005
    Location
    Chennai,India
    Posts
    694

    Re: keep cdrom close

    heyyyyy,I got ittttttttttttt
    VB Code:
    1. Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
    2.   (ByVal lpszCommand As String, ByVal lpszReturnString As String, _
    3.   ByVal cchReturnLength As Long, ByVal hwndCallback As Long) As Long
    4.     Dim returnstring As New StringBuilder
    5.  
    6.  
    7.  
    8.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9.         mciSendString("set CDAudio door open", 0, 0, 0)
    10.     End Sub
    Dont forget the imports system.text
    Hope this helps u student buddy ...Thanks,I also learnt bcos of u
    Godwin

    Help someone else with what someone helped you!

  8. #8
    Hyperactive Member gjon's Avatar
    Join Date
    Nov 2004
    Location
    Inescapable Void
    Posts
    442

    Re: keep cdrom close

    Nice work, KUDOS!

    Could you put some commenting in that code. I'd like to understand whats going on with it. =) Good job figuring it out.
    Last edited by gjon; Aug 27th, 2005 at 08:39 AM.

  9. #9
    Fanatic Member uniquegodwin's Avatar
    Join Date
    Jul 2005
    Location
    Chennai,India
    Posts
    694

    Re: keep cdrom close

    irrrr,forgive me,That code only opens...closing doesnt work...ill find it out with my friends too
    Godwin

    Help someone else with what someone helped you!

  10. #10
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    111,221

    Re: keep cdrom close

    Can I say that using a Timer to check every second and close it if it's open is very inefficient and really dodgy code. Audio and burning software lock CD drives to prevent access so that would be the way to do it. What's to stop your friends closing your app to get access though? If you can't just tell your friends not to install things on your machine them I'd say you need new friends.
    Why is my data not saved to my database? | MSDN Data Walkthroughs
    VBForums Database Development FAQ
    My CodeBank Submissions: VB | C#
    My Blog: Data Among Multiple Forms (3 parts)
    Beginner Tutorials: VB | C# | SQL

  11. #11
    Hyperactive Member
    Join Date
    Jul 2005
    Posts
    297

    Re: keep cdrom close

    in win xp
    similar in 2000 no doubt...

    computer management -> Storage
    right click Removable storage, click properties, click security tab
    disallow Users from using the drive.

    Or download a freeware drive locker...

    If you insist then this will catch the message as the disk is ejected and determine if it is a cd, and get the letter (info written with debug.writeline). The meesage is passed after the eject has started, so you can't override it, but you could suck the tray back in. The messages only occur if there is a finalized CD in the tray.

    VB Code:
    1. Private Const GWL_WNDPROC As Long = (-4)
    2.     Private Const WM_DEVICECHANGE As Long = &H219
    3.     Private Const DBT_DEVNODES_CHANGED As Long = &H7
    4.     Private Const DBT_DEVICEARRIVAL As Long = &H8000&
    5.     Private Const DBT_DEVICEREMOVECOMPLETE As Long = &H8004&
    6.     Private Const DBT_DEVTYP_VOLUME As Long = &H2 ' Logical volume
    7.     Private Const DBT_DEVTYP_DEVICEINTERFACE As Long = &H5 ' Device interface class
    8.     Private Const DBTF_MEDIA As Long = &H1 ' Media comings and goings
    9.     Private Const DBTF_NET As Long = &H2 ' Network volume
    10.     Private Enum DriveType As Integer
    11.         DRIVE_UNKNOWN = 0
    12.         DRIVE_NO_ROOT_DIR = 1
    13.         DRIVE_REMOVABLE = 2
    14.         DRIVE_FIXED = 3
    15.         DRIVE_REMOTE = 4
    16.         DRIVE_CDROM = 5
    17.         DRIVE_RAMDISK = 6
    18.  
    19.     End Enum
    20.  
    21.     Private Structure DEV_BROADCAST_HDR
    22.         Public dbch_size As Integer
    23.         Public dbch_devicetype As Integer
    24.         Public dbch_reserved As Integer
    25.     End Structure
    26.  
    27.     Private Structure DEV_BROADCAST_VOLUME
    28.         Public dbcv_size As Integer
    29.         Public dbcv_devicetype As Integer
    30.         Public dbcv_reserved As Integer
    31.         Public dbcv_unitmask As Integer
    32.         Public dbcv_Flags As Short
    33.     End Structure
    34.  
    35.     Private Declare Auto Function GetDriveType Lib "kernel32.dll" ( _
    36.                 ByVal nDrive As String) As DriveType
    37.  
    38.     Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    39.  
    40.      
    41.         If m.Msg = WM_DEVICECHANGE Then
    42.             'store the wparam
    43.             Dim WParam As Int32 = m.WParam.ToInt32()
    44.             'Handle the CD messages
    45.             Select Case WParam
    46.                 Case DBT_DEVICEARRIVAL
    47.                     Debug.WriteLine(showInfo(m, WParam) & " arrived")
    48.                 Case DBT_DEVICEREMOVECOMPLETE
    49.                     Debug.WriteLine(showInfo(m, WParam) & " removed")
    50.                     m.Msg = &H0
    51.             End Select
    52.             Me.Refresh()
    53.         End If
    54.         'Call base WndProc for default handling
    55.         MyBase.WndProc(m)
    56.     End Sub
    57.  
    58.     Private Function showInfo(ByVal m As System.Windows.Forms.Message, ByVal WParam As Int32) As String
    59.         Dim infoString As String
    60.         Dim Header As DEV_BROADCAST_HDR
    61.         Dim HeaderVolume As DEV_BROADCAST_VOLUME
    62.         Dim HdrType As Type = GetType(DEV_BROADCAST_HDR)
    63.         Header = CType(Marshal.PtrToStructure(m.LParam, HdrType), DEV_BROADCAST_HDR)
    64.         If Header.dbch_devicetype = DBT_DEVTYP_VOLUME Then
    65.             Dim Bits As BitArray
    66.             Dim VolumeLetters As New ArrayList
    67.             Dim Bit As Boolean
    68.             Dim Charcode As Integer = Asc("A"c)
    69.             HeaderVolume = CType(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_VOLUME)), DEV_BROADCAST_VOLUME)
    70.             Bits = New BitArray(BitConverter.GetBytes(HeaderVolume.dbcv_unitmask))
    71.             For Each Bit In Bits
    72.                 If Bit Then
    73.                     Dim driveLetter As String = Chr(Charcode)
    74.                     VolumeLetters.Add(Charcode)
    75.                     Dim thisDrivetype As DriveType
    76.                     thisDrivetype = GetDriveType(driveLetter & ":\")
    77.                     infoString = "drive " & driveLetter & " " & thisDrivetype.ToString & vbCrLf
    78.                 End If
    79.                 Charcode += 1
    80.             Next
    81.         End If
    82.         Return infoString
    83.     End Function

    requires imports system.runtime.interopservices

  12. #12
    Hyperactive Member
    Join Date
    Jul 2005
    Posts
    297

    Re: keep cdrom close

    Heres how to do it...
    You need to send IOCTL_STORAGE_MEDIA_REMOVAL using the DeviceIOControl Function, use true to lock, false to unlock.
    See the msdn library for details.

    Requires Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.

    VB Code:
    1. Private _locked As Boolean
    2.     Private Const INVALID_HANDLE_VALUE As Short = -1
    3.     Private Const OPEN_EXISTING As Short = 3
    4.     Private Const FILE_ATTRIBUTE_NORMAL As Short = &H80S
    5.     Private Const FILE_SHARE_READ As Short = &H1S
    6.     Private Const FILE_SHARE_WRITE As Short = &H2S
    7.     Private Const GENERIC_READ As Integer = &H80000000
    8.     Private Const IOCTL_STORAGE_MEDIA_REMOVAL As Integer = 2967556
    9.  
    10.     'We use CreateFile to get a handle to the drive
    11.     Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
    12.             (ByVal lpFileName As String, _
    13.             ByVal dwDesiredAccess As Integer, _
    14.             ByVal dwShareMode As Integer, _
    15.             ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, _
    16.             ByVal dwCreationDisposition As Integer, _
    17.             ByVal dwFlagsAndAttributes As Integer, _
    18.             ByVal hTemplateFile As Integer) As Integer
    19.  
    20.     'We use this to send PREVENT_MEDIA_REMOVAL to the drive using the handle
    21.     Private Declare Function DeviceIoControl Lib "kernel32" ( _
    22.             ByVal hDevice As Integer, _
    23.             ByVal dwIoControlCode As Integer, _
    24.             ByRef lpInBuffer As Boolean, _
    25.             ByVal nInBufferSize As Integer, _
    26.             ByRef lpOutBuffer As Integer, _
    27.             ByVal nOutBufferSize As Integer, _
    28.             ByRef lpBytesReturned As Integer, _
    29.             ByRef lpOverlapped As OVERLAPPED) As Integer
    30.  
    31.  
    32.     'Required structure, wil be passed blank
    33.     Private Structure OVERLAPPED
    34.         Public Internal As Integer
    35.         Public InternalHigh As Integer
    36.         Public offset As Integer
    37.         Public OffsetHigh As Integer
    38.         Public hEvent As Integer
    39.     End Structure
    40.  
    41.     'Required structure, wil be passed blank
    42.     Private Structure SECURITY_ATTRIBUTES
    43.         Dim nLength As Integer
    44.         Dim lpSecurityDescriptor As Integer
    45.         Dim bInheritHandle As Integer
    46.     End Structure
    47.  
    48.     'Close the handle we got by using CreateFile to open the drive
    49.     Private Declare Function CloseHandle Lib "kernel32" ( _
    50.             ByVal hObject As Integer) As Integer
    51.  
    52.     Private Function LockMedia(ByRef DriveLetter As String, ByRef Lock As Boolean) As Boolean
    53.         'convert drive letter to a device path
    54.         Dim FullDrivePath As String = "//./" & DriveLetter
    55.         Dim hDrive As Integer
    56.  
    57.         hDrive = CreateFile(FullDrivePath, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, _
    58.         New SECURITY_ATTRIBUTES, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    59.  
    60.         If hDrive <> INVALID_HANDLE_VALUE Then
    61.             LockMedia = CBool(DeviceIoControl(hDrive, IOCTL_STORAGE_MEDIA_REMOVAL, _
    62.             Lock, 1, 0, 0, New Integer, New OVERLAPPED))
    63.  
    64.             Call CloseHandle(hDrive)
    65.         End If
    66.     End Function
    67.  
    68.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    69.  
    70.         If _locked Then
    71.             'pass the drive letter and a colon, then true to lock, false to unlock.
    72.             'if you lock n times then you have to unlock n times to get control back.
    73.  
    74.             LockMedia("E:", False)
    75.             Button1.Text = "Lock"
    76.             Me.Text = "Drive E is unlocked"
    77.         Else
    78.             LockMedia("E:", True)
    79.             Button1.Text = "Unlock"
    80.             Me.Text = "Drive E is locked"
    81.         End If
    82.         _locked = Not _locked
    83.  
    84.     End Sub

  13. #13
    Fanatic Member uniquegodwin's Avatar
    Join Date
    Jul 2005
    Location
    Chennai,India
    Posts
    694

    Re: keep cdrom close

    Thanks JoOLs This works superb to lock the drive.
    Godwin

    Help someone else with what someone helped you!

  14. #14
    Fanatic Member uniquegodwin's Avatar
    Join Date
    Jul 2005
    Location
    Chennai,India
    Posts
    694

    Re: keep cdrom close

    Anyways,for whoever wants how to close the door also..here it is...
    The reason it didnt work for me 1st was that I was so stupid to give the mci command wrong...sorry..lol
    VB Code:
    1. Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
    2. (ByVal lpszCommand As String, ByVal lpszReturnString As String, _
    3. ByVal cchReturnLength As Long, ByVal hwndCallback As Long) As Long
    4.  
    5.     Private Sub opencd()
    6.         mciSendString("set CDAudio door open", 0, 0, 0)
    7.     End Sub
    8.     Private Sub closecd()
    9.         mciSendString("set CDAudio door closed", 0, 0, 0)
    10.     End Sub
    Well,this is just for information.As Jm said and as code given by joOls,follow it to lock the drive instead of using a timer to close it.The code given by joOls above works very fine
    Godwin

    Help someone else with what someone helped you!

  15. #15
    Fanatic Member uniquegodwin's Avatar
    Join Date
    Jul 2005
    Location
    Chennai,India
    Posts
    694

    Re: keep cdrom close

    Quote Originally Posted by gjon
    Nice work, KUDOS!

    Could you put some commenting in that code. I'd like to understand whats going on with it. =) Good job figuring it out.
    Hey,I have a commented version for u here..I put it in the codebank too so that it might be of help to someone else too...
    here it is...
    http://www.vbforums.com/showthread.php?t=357496
    Godwin

    Help someone else with what someone helped you!

  16. #16
    Addicted Member
    Join Date
    May 2005
    Location
    USA Washington
    Posts
    191

    Re: keep cdrom close

    hey how do you specify whether it opens which drive?

  17. #17
    Fanatic Member uniquegodwin's Avatar
    Join Date
    Jul 2005
    Location
    Chennai,India
    Posts
    694

    Re: keep cdrom close

    Good question Hiroshi I myself have to figure that out..Thanks for asking..Ill get back soon
    Godwin

    Help someone else with what someone helped you!

  18. #18
    Hyperactive Member
    Join Date
    Jul 2005
    Posts
    297

    Re: keep cdrom close

    I started stripping down some IMAPI code to make something to enumerate the cdroms and eject, but it is still enormous, and anyway it will only do burner drives.
    So here is another way instead, using windows media players api:

    VB Code:
    1. 'look in oject browser: com component windows media player (wmp.dll)
    2.     Dim WithEvents lv As New ListView
    3.     Dim wmp As Object
    4.     Dim cdroms As Object
    5.     Dim cdrom As Object
    6.  
    7.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    8.         lv.View = View.Details
    9.         lv.Dock = DockStyle.Fill
    10.         lv.Columns.Add("Cdrom identifier", 100, HorizontalAlignment.Left)
    11.         lv.MultiSelect = False
    12.         Me.Controls.Add(lv)
    13.         wmp = CreateObject("WMPlayer.OCX.7")
    14.         cdroms = wmp.cdromCollection
    15.         For i As Long = 0 To wmp.cdromCollection.count - 1
    16.             cdrom = cdroms.item(i)
    17.             Dim lvi As New ListViewItem
    18.             lvi.Text = cdrom.drivespecifier
    19.             lvi.Tag = i
    20.             lv.Items.Add(lvi)
    21.         Next
    22.     End Sub
    23.  
    24.     'double click an item to eject
    25.     Private Sub lv_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lv.DoubleClick
    26.         If lv.SelectedItems(0) Is Nothing Then Exit Sub
    27.         Dim index As Integer = lv.SelectedItems(0).Tag ' we stored the cdrom index in the tag
    28.         cdrom = cdroms.item(index)
    29.         cdrom.eject()
    30.     End Sub

    I think there might be another way too, I'll pursue it...

  19. #19
    Hyperactive Member
    Join Date
    Jul 2005
    Posts
    297

    Re: keep cdrom close

    staring me in the face, very much like the code to lock the drive above:

    VB Code:
    1. Private Const INVALID_HANDLE_VALUE As Short = -1
    2.     Private Const OPEN_EXISTING As Short = 3
    3.     Private Const FILE_ATTRIBUTE_NORMAL As Short = &H80S
    4.     Private Const FILE_SHARE_READ As Short = &H1S
    5.     Private Const FILE_SHARE_WRITE As Short = &H2S
    6.     Private Const GENERIC_READ As Integer = &H80000000
    7.  
    8.     'Similar to the one to lock the drive above, but we send this message:
    9.     Private Const IOCTL_STORAGE_EJECT_MEDIA = &H2D4808
    10.     'oh, load aswell whilst I'm here...
    11.     Private Const IOCTL_STORAGE_LOAD_MEDIA = &H2D480C
    12.  
    13.     Private Declare Function DeviceIoControl Lib "kernel32" _
    14.     (ByVal hDevice As Integer, _
    15.      ByVal dwIoControlCode As Integer, _
    16.      ByRef lpInBuffer As Object, _
    17.      ByVal nInBufferSize As Integer, _
    18.      ByRef lpOutBuffer As Object, _
    19.      ByVal nOutBufferSize As Integer, _
    20.      ByRef lpBytesReturned As Integer, _
    21.      ByRef lpOverlapped As OVERLAPPED) As Integer
    22.  
    23.     'We use CreateFile to get a handle to the drive
    24.     Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
    25.             (ByVal lpFileName As String, _
    26.             ByVal dwDesiredAccess As Integer, _
    27.             ByVal dwShareMode As Integer, _
    28.             ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, _
    29.             ByVal dwCreationDisposition As Integer, _
    30.             ByVal dwFlagsAndAttributes As Integer, _
    31.             ByVal hTemplateFile As Integer) As Integer
    32.  
    33.     'Required structure, wil be passed blank
    34.     Private Structure SECURITY_ATTRIBUTES
    35.         Dim nLength As Integer
    36.         Dim lpSecurityDescriptor As Integer
    37.         Dim bInheritHandle As Integer
    38.     End Structure
    39.  
    40.     'Close the handle we got by using CreateFile to open the drive
    41.     Private Declare Function CloseHandle Lib "kernel32" ( _
    42.             ByVal hObject As Integer) As Integer
    43.  
    44.     'Required structure, wil be passed blank
    45.     Private Structure OVERLAPPED
    46.         Public Internal As Integer
    47.         Public InternalHigh As Integer
    48.         Public offset As Integer
    49.         Public OffsetHigh As Integer
    50.         Public hEvent As Integer
    51.     End Structure
    52.  
    53.     Private Function EjectMedia(ByRef DriveLetter As String) As Boolean
    54.         'convert drive letter to a device path
    55.         Dim FullDrivePath As String = "//./" & DriveLetter
    56.         Dim hDrive As Integer
    57.  
    58.         hDrive = CreateFile(FullDrivePath, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, _
    59.         New SECURITY_ATTRIBUTES, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    60.  
    61.         Dim lpBytesReturned As Integer
    62.         If hDrive <> INVALID_HANDLE_VALUE Then
    63.             EjectMedia = CBool(DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, _
    64.             0, 0, 0, 0, lpBytesReturned, New OVERLAPPED))
    65.             Call CloseHandle(hDrive)
    66.         End If
    67.     End Function
    68.  
    69.     Private Function LoadMedia(ByRef DriveLetter As String) As Boolean
    70.         'convert drive letter to a device path
    71.         Dim FullDrivePath As String = "//./" & DriveLetter
    72.         Dim hDrive As Integer
    73.  
    74.         hDrive = CreateFile(FullDrivePath, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, _
    75.         New SECURITY_ATTRIBUTES, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    76.  
    77.         Dim lpBytesReturned As Integer
    78.         If hDrive <> INVALID_HANDLE_VALUE Then
    79.             LoadMedia = CBool(DeviceIoControl(hDrive, IOCTL_STORAGE_LOAD_MEDIA, _
    80.             0, 0, 0, 0, lpBytesReturned, New OVERLAPPED))
    81.             Call CloseHandle(hDrive)
    82.         End If
    83.     End Function
    84.  
    85.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    86.         EjectMedia("D:")
    87.     End Sub
    88.  
    89.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    90.         LoadMedia("D:")
    91.     End Sub

    edit: added load_media as well, but I can't test it as I'm on a laptop that can't load cds itself. Now I just need to combine the lot, to programatically eject and load, and fire events when the user ejects or loads or adds a usb drive. It would be a useful class.
    Last edited by jo0ls; Oct 12th, 2005 at 05:51 PM.

  20. #20
    Fanatic Member uniquegodwin's Avatar
    Join Date
    Jul 2005
    Location
    Chennai,India
    Posts
    694

    Re: keep cdrom close

    cool ...Thanks for this one..
    but,I wonder if it can be done using shorter code too
    Godwin

    Help someone else with what someone helped you!

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width