Just_Plain_Cool Posted September 29, 2004 Posted September 29, 2004 Hi All, My first attempt at using AutoItX3.dll from within a VB application has become an adventure. The code works fine here on both machines I have, but I gave it to someone else and it is reporting this error: RunTime Error '429' - Active X Component Can't Create Object. Here is the offending code: Dim cAutoit As AutoItX3Lib.AutoItX3 'declare the AutoitX DLL in declarations Private Sub cmdExit_Click() Dim intPress As Integer If blnSaved = False Then intPress = MsgBox("Do you want to save before exiting?", vbYesNo, "Save Schedule?") If intPress = vbYes Then cmdSave_Click End If End If If blnSchChanged = True Then ' Schedule has changed Dim intResult As Integer 'declare a variable to hold autoitx function return values Set cAutoit = New AutoItX3Lib.AutoItX3 'create a new instance 'check whether LF_Monitor is opened or not intResult = cAutoit.WinExists("LF_Monitor ") If intResult = 1 Then ' result=1 means window exists cAutoit.WinClose ("LF_Monitor ") Do 'make sure LF_Monitor is closed intResult = cAutoit.WinExists("LF_Monitor ") Loop Until intResult = 0 intResult = cAutoit.Run("LF_Monitor") ' start LF_Monitor again Else intPress = MsgBox("Please remember that 'LF_Monitor.exe' must be running to process your schedule", vbOKOnly, "Reminder") End If Set cAutoit = Nothing End If Unload Me End End Sub Any help would be greatly appreciated... JPC
LOULOU Posted September 29, 2004 Posted September 29, 2004 Hi All,My first attempt at using AutoItX3.dll from within a VB application has become an adventure. The code works fine here on both machines I have, but I gave it to someone else and it is reporting this error:RunTime Error '429' - Active X Component Can't Create Object.Here is the offending code:Dim cAutoit As AutoItX3Lib.AutoItX3 'declare the AutoitX DLL in declarations Private Sub cmdExit_Click() Dim intPress As Integer If blnSaved = False Then intPress = MsgBox("Do you want to save before exiting?", vbYesNo, "Save Schedule?") If intPress = vbYes Then cmdSave_Click End If End If If blnSchChanged = True Then ' Schedule has changed Dim intResult As Integer 'declare a variable to hold autoitx function return values Set cAutoit = New AutoItX3Lib.AutoItX3 'create a new instance 'check whether LF_Monitor is opened or not intResult = cAutoit.WinExists("LF_Monitor ") If intResult = 1 Then ' result=1 means window exists cAutoit.WinClose ("LF_Monitor ") Do 'make sure LF_Monitor is closed intResult = cAutoit.WinExists("LF_Monitor ") Loop Until intResult = 0 intResult = cAutoit.Run("LF_Monitor") ' start LF_Monitor again Else intPress = MsgBox("Please remember that 'LF_Monitor.exe' must be running to process your schedule", vbOKOnly, "Reminder") End If Set cAutoit = Nothing End If Unload Me End End SubAny help would be greatly appreciated...JPC <{POST_SNAPBACK}>Instead of using ActiveX Set cAutoit = New AutoItX3Lib.AutoItX3 'create a new instanceuse Set cAutoit = CreateObject("autoitx3.dll") ''create a new instanceafter it will be better for you witjhout any problem
Just_Plain_Cool Posted September 29, 2004 Author Posted September 29, 2004 (edited) Instead of using ActiveX Set cAutoit = New AutoItX3Lib.AutoItX3 'create a new instanceuse Set cAutoit = CreateObject("autoitx3.dll") ''create a new instanceafter it will be better for you witjhout any problem<{POST_SNAPBACK}>Hi LOULOU,Hmmm...I must be missing something here. I modified the source with your suggested change. Now I get the error that my user was reporting!JPC Edited September 29, 2004 by Just_Plain_Cool
Matt @ MPCS Posted September 29, 2004 Posted September 29, 2004 Refer to LOULOU's post on the other topic: Click Here!The DLL file must be registered on the computer in order for it to be use in that manner.*** Matt @ MPCS
Just_Plain_Cool Posted September 29, 2004 Author Posted September 29, 2004 Refer to LOULOU's post on the other topic: Click Here!The DLL file must be registered on the computer in order for it to be use in that manner.*** Matt @ MPCS<{POST_SNAPBACK}>Okay, I have changed to code as follows:If blnSchChanged = True Then ' Schedule has changed Dim intResult As Integer 'declare a variable to hold autoitx function return values Set WshShell = CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s AutoItX3.dll ", 0, True Set cAutoit = CreateObject("AutoItXx3.dll") 'create a new instance 'Set cAutoit = New AutoItX3Lib.AutoItX3 'create a new instanceEverything between the line with Dim intResult line and the next to comment line at the end has been changed. I'm still getting the error. Argh...Thanks for the help guys,JPC
Matt @ MPCS Posted September 29, 2004 Posted September 29, 2004 Okay, I have changed to code as follows:If blnSchChanged = True Then ' Schedule has changed Dim intResult As Integer 'declare a variable to hold autoitx function return values Set WshShell = CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s AutoItX3.dll ", 0, True Set cAutoit = CreateObject("AutoItXx3.dll") 'create a new instance 'Set cAutoit = New AutoItX3Lib.AutoItX3 'create a new instanceEverything between the line with Dim intResult line and the next to comment line at the end has been changed. I'm still getting the error. Argh...Thanks for the help guys,JPC <{POST_SNAPBACK}>I believe you need to include the path the the dll file.If blnSchChanged = True Then ' Schedule has changed Dim intResult As Integer 'declare a variable to hold autoitx function return values Set WshShell = CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s " & @ScriptDir & "\AutoItX3.dll ", 0, True Set cAutoit = CreateObject("AutoItXx3.dll") 'create a new instance 'Set cAutoit = New AutoItX3Lib.AutoItX3 'create a new instanceThe above should work if the dll is in the same directory as the script.*** Matt @ MPCS
Just_Plain_Cool Posted September 30, 2004 Author Posted September 30, 2004 I believe you need to include the path the the dll file.If blnSchChanged = True Then ' Schedule has changed Dim intResult As Integer 'declare a variable to hold autoitx function return values Set WshShell = CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s " & @ScriptDir & "\AutoItX3.dll ", 0, True Set cAutoit = CreateObject("AutoItXx3.dll") 'create a new instance 'Set cAutoit = New AutoItX3Lib.AutoItX3 'create a new instanceThe above should work if the dll is in the same directory as the script.*** Matt @ MPCS<{POST_SNAPBACK}>Alas, this did not solve it either. The '@' gives a compile error as an invalid character.Any other ideas??? JPC
Matt @ MPCS Posted September 30, 2004 Posted September 30, 2004 Alas, this did not solve it either. The '@' gives a compile error as an invalid character.Any other ideas??? JPC <{POST_SNAPBACK}>Whoops forgot we are talking about VB not AutoIt... replace the @ScriptDir with App.Path.*** Matt @ MPCS
Just_Plain_Cool Posted September 30, 2004 Author Posted September 30, 2004 Whoops forgot we are talking about VB not AutoIt... replace the @ScriptDir with App.Path.*** Matt @ MPCS<{POST_SNAPBACK}>Hi Matt,Well, that moved the error... It is now erroring on this line:Set cAutoit = CreateObject("AutoItX3.dll") 'create a new instanceI have also tried:Set cAutoit = CreateObject(App.Path & "\AutoItX3.dll") 'create a new instanceThis error has been a real PITA...JPC
Matt @ MPCS Posted September 30, 2004 Posted September 30, 2004 The create object function sets a variables type not a filename. I also suggest declaring ALL variables before use. To be sure this is happening place "Option Explicit" at the top of the Module. Try the following code: Dim intResult As Integer 'declare a variable to hold autoitx function return values Dim WshShell as Object Dim cAutoIt as Object Set WshShell = CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s AutoItX3.dll ", 0, True Set cAutoit = CreateObject("AutoItX3Lib.AutoItX3") 'create a new instance If you continue to get an error on this line then you may need to add it through the references dialog. Hope this helps! *** Matt @ MPCS
Just_Plain_Cool Posted September 30, 2004 Author Posted September 30, 2004 The create object function sets a variables type not a filename. I also suggest declaring ALL variables before use. To be sure this is happening place "Option Explicit" at the top of the Module. Try the following code:If you continue to get an error on this line then you may need to add it through the references dialog. Hope this helps!*** Matt @ MPCS<{POST_SNAPBACK}>Hi Matt,Thank you for sticking with me through this. I know it will end up being so simple, but...I checked the references, "AutoItX3 1.0 Type Library" is already checked.These two statements are at the top of the module as declarations:Option Explicit Dim cAutoIt As AutoItX3Lib.AutoItX3 'declare the AutoitX DLLAnd then the sub is:Private Sub cmdExit_Click() Dim intPress As Integer Dim intResult As Integer 'declare a variable to hold autoitx function return values Dim WshShell As Object Dim cAutoIt As Object If blnSaved = False Then intPress = MsgBox("Do you want to save before exiting?", vbYesNo, "Save Schedule?") If intPress = vbYes Then cmdSave_Click End If End If If blnSchChanged = True Then ' Schedule has changed Set WshShell = CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s " & App.Path & "\AutoItX3.dll ", 0, True Set cAutoIt = CreateObject("AutoItX3Lib.AutoItX3") 'create a new instance 'check whether LF_Monitor is opened or not intResult = cAutoIt.WinExists("LF_Monitor ") If intResult = 1 Then ' result=1 means window exists, 0 means not exist cAutoIt.WinClose ("LF_Monitor ") Do 'make sure LF_Monitor is closed intResult = cAutoIt.WinExists("LF_Monitor ") Loop Until intResult = 0 intResult = cAutoIt.Run("LF_Monitor") ' start LF_Monitor again Else intPress = MsgBox("Please remember that 'LF_Monitor.exe' must be running to process your schedule", vbOKOnly, "Reminder") End If Set cAutoIt = Nothing End If Unload Me End End SubIn addition to your suggestions, I have tried so many variations...I'm about ready to pull the plug. It is only being used to refresh the resulting schedule in a running utility. I had originally just put in a message telling them to do it manually. I'd rather do it for them, but...JPC
Matt @ MPCS Posted September 30, 2004 Posted September 30, 2004 Hi Matt,Thank you for sticking with me through this. I know it will end up being so simple, but...I checked the references, "AutoItX3 1.0 Type Library" is already checked.These two statements are at the top of the module as declarations:Option Explicit Dim cAutoIt As AutoItX3Lib.AutoItX3 'declare the AutoitX DLLAnd then the sub is:Private Sub cmdExit_Click() Dim intPress As Integer Dim intResult As Integer 'declare a variable to hold autoitx function return values Dim WshShell As Object Dim cAutoIt As Object If blnSaved = False Then intPress = MsgBox("Do you want to save before exiting?", vbYesNo, "Save Schedule?") If intPress = vbYes Then cmdSave_Click End If End If If blnSchChanged = True Then ' Schedule has changed Set WshShell = CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s " & App.Path & "\AutoItX3.dll ", 0, True Set cAutoIt = CreateObject("AutoItX3Lib.AutoItX3") 'create a new instance 'check whether LF_Monitor is opened or not intResult = cAutoIt.WinExists("LF_Monitor ") If intResult = 1 Then ' result=1 means window exists, 0 means not exist cAutoIt.WinClose ("LF_Monitor ") Do 'make sure LF_Monitor is closed intResult = cAutoIt.WinExists("LF_Monitor ") Loop Until intResult = 0 intResult = cAutoIt.Run("LF_Monitor") ' start LF_Monitor again Else intPress = MsgBox("Please remember that 'LF_Monitor.exe' must be running to process your schedule", vbOKOnly, "Reminder") End If Set cAutoIt = Nothing End If Unload Me End End SubIn addition to your suggestions, I have tried so many variations...I'm about ready to pull the plug. It is only being used to refresh the resulting schedule in a running utility. I had originally just put in a message telling them to do it manually. I'd rather do it for them, but...JPC <{POST_SNAPBACK}>Oh man, change this:Option Explicit Dim cAutoIt As AutoItX3Lib.AutoItX3 'declare the AutoitX DLLto this:Option Explicit Dim cAutoIt As Object 'declare the AutoitX DLLThen change yoursubroutine to :Private Sub cmdExit_Click() Dim intPress As Integer Dim intResult As Integer 'declare a variable to hold autoitx function return values If blnSaved = False Then intPress = MsgBox("Do you want to save before exiting?", vbYesNo, "Save Schedule?") If intPress = vbYes Then cmdSave_Click End If End If If blnSchChanged = True Then ' Schedule has changed 'check whether LF_Monitor is opened or not intResult = cAutoIt.WinExists("LF_Monitor ") If intResult = 1 Then ' result=1 means window exists, 0 means not exist cAutoIt.WinClose ("LF_Monitor ") Do 'make sure LF_Monitor is closed intResult = cAutoIt.WinExists("LF_Monitor ") Loop Until intResult = 0 intResult = cAutoIt.Run("LF_Monitor") ' start LF_Monitor again Else intPress = MsgBox("Please remember that 'LF_Monitor.exe' must be running to process your schedule", vbOKOnly, "Reminder") End If Set cAutoIt = Nothing End If Unload Me End End SubAnd add:Private Sub Form_Load() Dim WshShell as Object Set WshShell = New CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s " & App.Path & "\AutoItX3.dll ", 0, True Set cAutoIt = New AutoItX3Lib.AutoItX3 End SubAnd make sure you have the DLL in the application directory or it won't have the file to register. I hope this works *fingers crossed*. *** Matt @ MPCS
Just_Plain_Cool Posted September 30, 2004 Author Posted September 30, 2004 Oh man, change this:Option Explicit Dim cAutoIt As AutoItX3Lib.AutoItX3 'declare the AutoitX DLLto this:Option Explicit Dim cAutoIt As Object 'declare the AutoitX DLLThen change yoursubroutine to :Private Sub cmdExit_Click() Dim intPress As Integer Dim intResult As Integer 'declare a variable to hold autoitx function return values If blnSaved = False Then intPress = MsgBox("Do you want to save before exiting?", vbYesNo, "Save Schedule?") If intPress = vbYes Then cmdSave_Click End If End If If blnSchChanged = True Then ' Schedule has changed 'check whether LF_Monitor is opened or not intResult = cAutoIt.WinExists("LF_Monitor ") If intResult = 1 Then ' result=1 means window exists, 0 means not exist cAutoIt.WinClose ("LF_Monitor ") Do 'make sure LF_Monitor is closed intResult = cAutoIt.WinExists("LF_Monitor ") Loop Until intResult = 0 intResult = cAutoIt.Run("LF_Monitor") ' start LF_Monitor again Else intPress = MsgBox("Please remember that 'LF_Monitor.exe' must be running to process your schedule", vbOKOnly, "Reminder") End If Set cAutoIt = Nothing End If Unload Me End End SubAnd add:Private Sub Form_Load() Dim WshShell as Object Set WshShell = New CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s " & App.Path & "\AutoItX3.dll ", 0, True Set cAutoIt = New AutoItX3Lib.AutoItX3 End SubAnd make sure you have the DLL in the application directory or it won't have the file to register. I hope this works *fingers crossed*. *** Matt @ MPCS<{POST_SNAPBACK}>Hi Matt,That appears to have gotten it. I had to remove the "New" from the "Set WshShell" line, but it is running error free here. Now to try it with my user. I'll let you know if there is any problem for her...Thank you VERY much!JPC
Matt @ MPCS Posted September 30, 2004 Posted September 30, 2004 (edited) Hi Matt,That appears to have gotten it. I had to remove the "New" from the "Set WshShell" line, but it is running error free here. Now to try it with my user. I'll let you know if there is any problem for her...Thank you VERY much!JPC <{POST_SNAPBACK}>NOTE: you may want to add a form close sub that contains cleanup code for the objects:Private Sub Form_Load() Dim WshShell as Object Set WshShell = New CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s " & App.Path & "\AutoItX3.dll ", 0, True Set cAutoIt = New AutoItX3Lib.AutoItX3 Set WshShell = Nothing End Sub Private Sub Form_QueryUnload(?) Set cAutoIt = Nothing End SubAlso try to run the code using the start with full compile before you share it to make sure there aren't any syntax errors that you may have missed.*** Matt @ MPCS Edited September 30, 2004 by Matt @ MPCS
Just_Plain_Cool Posted October 1, 2004 Author Posted October 1, 2004 (edited) NOTE: you may want to add a form close sub that contains cleanup code for the objects:Private Sub Form_Load() Dim WshShell as Object Set WshShell = New CreateObject("WScript.Shell") WshShell.Run "Regsvr32 /s " & App.Path & "\AutoItX3.dll ", 0, True Set cAutoIt = New AutoItX3Lib.AutoItX3 Set WshShell = Nothing End Sub Private Sub Form_QueryUnload(?) Set cAutoIt = Nothing End SubAlso try to run the code using the start with full compile before you share it to make sure there aren't any syntax errors that you may have missed.*** Matt @ MPCS<{POST_SNAPBACK}>Argh! Two users just reported in. They are both now getting the error without the program ever showing up, meaning that it is in Private Sub Form_Load(). Is there something they could have set on their machines that could be causing this? I have three machines here with three different versions of windows and the compiled code worked on all three of them without a hitch. JPC Edited October 1, 2004 by Just_Plain_Cool
Matt @ MPCS Posted October 1, 2004 Posted October 1, 2004 For testing purposes I would write a batch script that registers the dll and remove that code from the Form_Load(). Beyond that I am as helpless as you... try surfing the net to see if you get anything. *** Matt @ MPCS
Just_Plain_Cool Posted October 1, 2004 Author Posted October 1, 2004 For testing purposes I would write a batch script that registers the dll and remove that code from the Form_Load(). Beyond that I am as helpless as you... try surfing the net to see if you get anything.*** Matt @ MPCS<{POST_SNAPBACK}>Hi Matt,You are on the money. The problem is that the dll is not being registered. It ran locally because I had registered the dll manually before I added code to register the dll. I have now unregistered the dll on my machines and the code errors on all of them. That means that something is wrong in this code:Dim WshShell As Object Set WshShell = CreateObject("WScript.Shell") 'create WshShell object WshShell.Run "Regsvr32 /s " & App.Path & "\AutoItX3.dll ", 0, True Set cAutoIt = New AutoItX3Lib.AutoItX3 Set WshShell = Nothing 'delete WshShell objectJPC
Matt @ MPCS Posted October 1, 2004 Posted October 1, 2004 (edited) Hi Matt,You are on the money. The problem is that the dll is not being registered. It ran locally because I had registered the dll manually before I added code to register the dll. I have now unregistered the dll on my machines and the code errors on all of them. That means that something is wrong in this code:Dim WshShell As Object Set WshShell = CreateObject("WScript.Shell") 'create WshShell object WshShell.Run "Regsvr32 /s " & App.Path & "\AutoItX3.dll ", 0, True Set cAutoIt = New AutoItX3Lib.AutoItX3 Set WshShell = Nothing 'delete WshShell objectJPC <{POST_SNAPBACK}>I figured as much, I am going to refer you to some online source that will register the library using the Win API rather than assuming regsrvr32 is working properly. I have only used this code once but I don't recall if it was buggy. There is also a small forum at the bottom where people list the problems and praise about it. Here it is!This should put you on the right direction.*** Matt @ MPCSEDIT: Found a shorter version of that code. Copy this into a module:expandcollapse popupPublic Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Public Sub RegisterServer(lngHwnd As Long, strDllServerPath As String, boolRegister As Boolean) ' lngHwnd is hWnd of some form in your project. On Error Resume Next Dim lngResult As Long Dim lngProcAddress As Long dim strProc As String ' Check if file have length > 0 If FileLen(strDllServerPath) > 0 Then ' Load file for use in our app lngResult = LoadLibrary(strDllServerPath) ' If result differs from 0 then loading was successful If lngResult <> 0 Then ' If we must register If boolRegister = True Then strProc="DllRegisterServer" Else ' If we must unregister strProc="DllUnregisterServer" End If ' Get procedure address lngProcAddress = GetProcAddress(lngResult, strProc) ' Call the appropriate procedure in DLL file (DllRegisterServer or DllUnregisterServer) ' It's address is in lngProcAddress variable CallWindowProc lngProcAddress, lngHwnd, ByVal 0&, ByVal 0&, ByVal 0& ' Unload file FreeLibrary lngResult End If End If End FunctionTo register DLL use this:RegisterServer Form1.hWnd,"C:\Windows\System\Mydll.dll",TrueTo unregister DLL use this:RegisterServer Form1.hWnd,"C:\Windows\System\Mydll.dll",FalseThis code came from here. Edited October 1, 2004 by Matt @ MPCS
Just_Plain_Cool Posted October 1, 2004 Author Posted October 1, 2004 I figured as much, I am going to refer you to some online source that will register the library using the Win API rather than assuming regsrvr32 is working properly. I have only used this code once but I don't recall if it was buggy. There is also a small forum at the bottom where people list the problems and praise about it. Here it is!This should put you on the right direction.*** Matt @ MPCSEDIT: Found a shorter version of that code. Copy this into a module:Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Public Sub RegisterServer(lngHwnd As Long, strDllServerPath As String, boolRegister As Boolean) ' lngHwnd is hWnd of some form in your project. On Error Resume Next Dim lngResult As Long Dim lngProcAddress As Long dim strProc As String ' Check if file have length > 0 If FileLen(strDllServerPath) > 0 Then ' Load file for use in our app lngResult = LoadLibrary(strDllServerPath) ' If result differs from 0 then loading was successful If lngResult <> 0 Then ' If we must register If boolRegister = True Then strProc="DllRegisterServer" Else ' If we must unregister strProc="DllUnregisterServer" End If ' Get procedure address lngProcAddress = GetProcAddress(lngResult, strProc) ' Call the appropriate procedure in DLL file (DllRegisterServer or DllUnregisterServer) ' It's address is in lngProcAddress variable CallWindowProc lngProcAddress, lngHwnd, ByVal 0&, ByVal 0&, ByVal 0& ' Unload file FreeLibrary lngResult End If End If End FunctionTo register DLL use this:RegisterServer Form1.hWnd,"C:\Windows\System\Mydll.dll",TrueTo unregister DLL use this:RegisterServer Form1.hWnd,"C:\Windows\System\Mydll.dll",FalseThis code came from here.<{POST_SNAPBACK}>I'm thinking of taking an easy way out. The code you have been helping with is a schedule manager for a set of interacting AutoIt scripts. I could run a compiled script from the installer that registered the dll and then when they use the main script, have it delete delete the script that installs the dll. Then the code doesn't have to be in the .exe. What do you think? I'd have to learn to use @comspec, to do it, but...JPC
Matt @ MPCS Posted October 1, 2004 Posted October 1, 2004 I don't think that will simplify things for you. That just stretches the problem to not only include your current issues within VB but then you will be running into debugging your autoit scripts on top of it. I mean it should work but it will make your application less portable. If you included the dll registration directly into the exe then all you would have to do is pass the scripts to be run by the sceduler... the scheduler itself... and the dll files required for VB. If you wanted to enclode that all into a single executable it would be possible if you used my EXE wrapper shared on the Scripts and Scraps forum. Overall it comes down to that it is your application... you are the developer so you have to make these decisions. There are too many factors that I am unaware of that I don't know that I can even make a decent suggestion for this question. This post probably isn't going to get you any closer to your goal... just make a decision. *** Matt @ MPCS
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now