|
Thanks for your answer Dave. It looks as though I will abandon this project in Visual Basic and move over to Pearl as this can be achieved with that language.
|
|
|
|
|
The original message was a clr20r3 message - clr20r3, P1 getmetsatdata.exe, P2 2.1.21.5, P3 4ad621e6, P4 getmetsatdata, P5 2.1.21.5, P6 4ad621e6, P7 20, P8 c6, P9 system.invalidoperationexception, P10 NIL.
I have searched the Internet, and here, and got lots of answers as to how to find out what this error is and have managed to get the program to create a text file on hitting the unhandled exception which tells me this is a 'network path not found error', so I got it to output the stack trace which tells me this:
17/10/2009 11:34:12
Unhandled exception on start up
at GetMetSatData.My.MyProject.MyForms.Create__Instance__[T](T Instance)
at GetMetSatData.My.MyProject.MyForms.get_FGetMetSat()
at GetMetSatData.My.MyApplication.OnCreateMainForm()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
This does not happen of the development machine by the way , but on 2 (or more) XP machines on which it has been installed.
My problem is that I have absolutely no idea what 'network path' this is referring to!
|
|
|
|
|
Not enough information to answer the question.
What do the app do?? What does the app do on startup?? Are you using any threading in the app?? What is going on in the threaded sections??
|
|
|
|
|
The app collects satellite pictures from the EUMETSAT site. On startup it checks the registry, but it never gets as far as that as it crashes even before it writes the first event log entry. There is no threading.
Private Sub FGetMetSat_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim intLoop As Integer = 0
Dim listErrors As New List(Of String)
Try
EventLog1.WriteEntry("MetSatGetter " & Application.ProductVersion & " was started: " & Now.ToString, EventLogEntryType.Information, 60000)
If RegistrySet() = False Then
Dim myKey As RegistryKey = My.Computer.Registry.CurrentUser.OpenSubKey("Software\DA Software\MetSat\Imagery\MSG\IR039\COL\AMERICA", False)
If myKey Is Nothing = True Then
'We may have a problem here - false overwrite
listErrors = Registry_Setup()
If listErrors.Count > 0 Then
SaveErrorList(listErrors)
End If
Else
If MsgBox("Problem: Your settings are indicating that the program registry was not installed, but one of the keys was found possibly indicating " _
& "that registry entries have been removed, or some other problem has occurred." & vbCrLf & vbCrLf _
& "MetSatGetter will now re-create the keys unless you click 'Cancel'. Note recreating the keys will overwrite any settings.", _
MsgBoxStyle.OkCancel + MsgBoxStyle.Critical, "Met Sat Getter") = MsgBoxResult.Cancel Then
'User is cancelling
m_bRegLoadError = True
For intLoop = 0 To Me.cmsMain.Items.Count - 2
Me.cmsMain.Items(intLoop).Enabled = False
Next
MsgBox("Please wait for the program to terminate. This should happen in about 1 minute, or you can terminate it yourself.", MsgBoxStyle.Information, "Met Sat Getter")
Else
listErrors = Registry_Setup()
If listErrors.Count > 0 Then
m_bRegLoadError = True
SaveErrorList(listErrors)
Else
ParseTasks()
Me.trayIcon.Text = "Met Sat Getter - " & Tasks.Count.ToString & " tasks active"
End If
End If
End If
Else
ParseTasks()
Me.trayIcon.Text = "Met Sat Getter - " & Tasks.Count.ToString & " tasks active"
End If
TempDump = SettingsKey.GetValue("TempFolder", "")
DefaultDump = SettingsKey.GetValue("DefaultFolder", "")
Me.tmrMain.Enabled = True
Me.WindowState = FormWindowState.Minimized
Catch ex As Exception
EventLog1.WriteEntry("MetSatGetter error: " & ex.Message, EventLogEntryType.FailureAudit, 60112)
EventLog1.WriteEntry("MetSatGetter failed on the load routine: " & Now.ToString, EventLogEntryType.Information, 60112)
End Try
End Sub
|
|
|
|
|
OK, all of this looks decent. I'd move on to the Form's constructor (New method) and whatever is in the InitializeComponent method. This could mean that you have a problem with a control on the form.
|
|
|
|
|
The programmer had sat at his machine most of the weekend so far tearing out his hair and burning the midnight oil. He looked though every single line of code, those produced by him and those produced by VS.
Nothing, no answers. Every run on a different machine failed.
On Sunday he received a mail from Dave Kreskowiak, a coder supreme, a God amongst programmers. Heartened that Dave thought his code looked OK, the programmer was never the less still tearing his hair out.
Dave said "and whatever is in the InitializeComponent method". Huh? He thinks I have not looked at that a million times. OK, well one last time.
The programmer saw something, and hung his head in abject shame. If this was the cause of several days of heartache he deserved a good kicking. In the EventLog control property he had filled the name of the LocalMachine with his machine's name! Was this the cause ----> Oh yes it was. Once replaced with a dot everything worked.
The programmer gave thanks to Dave , groveling on the floor before the greatness of the man and thinking, my name may be as his, but it will be many years before I aspire to such greatness. He then went out side to kick himself thoroughly.
|
|
|
|
|
TheComputerMan wrote: a God amongst programmers
Hardly. But, I am willing to accept a sacrifice!
TheComputerMan wrote: Dave said "and whatever is in the InitializeComponent method". Huh? He thinks I have not looked at that a million times. OK, well one last time.
2 clues pointed in that direction after seeing the code. First, the error you originally posted was an unheandled exception. Second, you said it never made an event log entry. That was pretty much the first line of code in the Load handler, so it appears that it never got this far.
The order for execution of a Form start's with the contructor, then goes to InitializeComponent, then the Load event is raised, where your Load handler gets called. Those two clues says that either the New method (constructor) failed, but it's rare to find code in a Form's New method, or in InitializeComponent, which New calls by default. Also, You normally don't find Try/Catch blocks in InitializeComponent so the exception most likely came from there.
TheComputerMan wrote: groveling on the floor before the greatness of the man
You can get up now. I work for a living. I can only wish I could sit around and have my wife feed me grapes all day.
|
|
|
|
|
Log the entire ex.ToString() , the stack-trace could contain some clues.
Create a dummy-testapplication that writes the text "Hello World" to the event-log. Ditto for the registry
I are Troll
|
|
|
|
|
You're getting an error in the form FGetMetSat's constructor (I think). Beyond that, I've got no idea. More information please?
|
|
|
|
|
Hi there,
I have a prolem which is quite annoying which one of you right people might be able to tell me how to do very simply
I have a program which i have nearly completed, but to stop piracy i am having a txt file which reads the data from the program to see if the serial number is correct. HOWEVER i got so far however when the serial number is inputted "form2" is loaded and that works fine, but when i reload the program i don't want the CD key login form to re-appear. The form2 appears but in a flash (I have a slow computer so nottice that it is a form2). I have tried editing all aspects of the code but if any body could help me that would be cool
Here is the code if you want to look at it.
I used 1 button
1 text box
1 check box - supposed to be that if this is checked that it doesn't show this form
1 label
1 txt document in the debug\bin\labeled serial.txt
Public Class Form1
Dim FILE_NAME As String = ("serial.txt")
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim objReader As New System.IO.StreamReader(FILE_NAME)
Do Until objReader.EndOfStream
If txtserial.Text = objReader.ReadLine Then
Startnot.Checked = False
Form2.Show()
Me.Hide()
Else
Try
If txtserial.Text = objReader.ReadLine.Trim Then
End If
Catch Ex As Exception
End Try
Label1.Text = "Invalid CDKey"
End If
Loop
objReader.Close()
End Sub
Private Sub Form1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Leave
If Me.Visible = False Then
Form2.Show()
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SetAttr(FILE_NAME, FileAttribute.Normal)
Dim Dontshow As Boolean
Dontshow = GetSetting(My.Application.Info.ProductName, "Options", "Dont Show Me", 1)
If Dontshow = 0 Then
Form2.Show()
Call cookies()
Exit Sub
End If
Startnot.Checked = True
End Sub
Private Sub Startnot_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Startnot.CheckedChanged
SaveSetting(My.Application.Info.ProductName, "Options", "Dont Show Me", Startnot.CheckState)
End Sub
Private Sub cookies()
Me.Close()
My.Forms.Form2.Show()
End Sub
End Class
|
|
|
|
|
Let me get this straight. Your putting the CDKey that the user has to input into a text file and shipping that with the application. When the user launches the app, they have to type the key in and that is compared to the key in the text file to see if the program will run. Do I have that correct??
|
|
|
|
|
Yes. There will already be serial keys in the .txt file e.g BC3 and if the user puts in BC4 that will b compared to the .txt file and bring back an error message saying. Nope were not letting you in.....
|
|
|
|
|
This is a complete waste of time. What's to stop the user from opening the text file in Notepad and entering what's in the text file?? Hint: Nothing!
Also, if the user want to copy the app to another machine without buying another copy, there is nothing stopping the user from copying the serial number file he already has!
Your copy protection scheme is never going to work.
|
|
|
|
|
Ummm yeah it will work cos i have another idea incorprating the code.
All i wanted was a bit of help with the code to try and get half of it working as I was struggaling!!!
|
|
|
|
|
Think about it. I asked for some help. I just wanted someone to help me to fix the code.
If this sounds any better i would like a program incorpating the code which is SIMULAR to a CD key login, my current code works however when the key is pressed in the first time the next form is displayed howver i want it so that when the program is run again the "next form" appears straight away rather than running through the cd key log in
I think its better to learn more complex things than being told NOPE it won't work there nothing to stop blah blah blah. Microsoft haven't stopped piracy and neither can i, but i can make it harder for people
|
|
|
|
|
I agree and I will audit your code for you and see where you made mistakes, but sometimes it is better to abandon your current design and implement something more complex which will not only improve your current situation but provide better security for your future projects.
Application designs can change and are often the most complex part of a project, if the people here tell you that maybe you should be looking at something else it is because of the experience this community has.
See my post below for a different suggestion, if you persist to go about this message let me know and I will start to go through the code. I highly suggest you consider different alternatives, at the very least encrypt your cd key..
|
|
|
|
|
I have to agree with Dave on this one, what's to stop the user from reading the CD key from a plain text file? I do not see any encryption or decryption, which still doesn't guarantee security..
|
|
|
|
|
ok its not the strongest of programs but i just wanted to get this let app working?
You could always hide the text file?!?
|
|
|
|
|
At that point you're better of just having a const string in your code with the cdkey instead of putting it in plain site...
Why not have an algorithm that generates keys based off an email or username, something a little more complex but a hell of a lot more secure then saving a cdkey in a text file.
|
|
|
|
|
if im being perfectly honest. Im not a great programer and it took a little while generating teh code for the cd login. Can you help just to get it right? It doesn't other me that its not the most secure, i can learn these things later on
|
|
|
|
|
So what? You can always unhide it. Just because the file is tagged Hidden, doesn't mean it's really hidden.
You'd have to put the test file somewhere else, and even then, there are simple tools out there that can watch your app and see every single file that your app touches.
Using a key in a file is useless because the file can always be copied to another machine. You're not preventing anything from running by putting a key in a file. Using your current method, all you're really doing is making your app more inconvenient to use for your users, nothing more. You're not providing any security at all.
The security has to be tied to the machine somehow, not to a file.
|
|
|
|
|
yeah i know the application i am designing this program for is for kids that don't really know a lot about computers and unhiding and hiding files, so you can see where i am coming from hopefully.
Is ther any way you could have a look at my code so you can see what the problem is and hopefully come up with a solution
Thanks for all the solutions you've given me but i'd like to stick with this due to the explanation above.
|
|
|
|
|
I'd start by scrapping what you have and replacing it with a seperate class. You main form should call this class, call it "Licensing", to ask if it is OK to run the app. The Licensing class has to do a few things to answer this question.
First, it has to check to see if the app has already been through the CDKey entry process and that a valid Key was entered. This could be a value written to the registry or to your AppSettings file.
If the value doesn't exist or it indicates that the license is not valid, this class would put up a new form, or even just an InputBox, asking for the CD key. Once the key is entered, it is compared against the first line of the serial.txt file. If they match, then you create/update the value tracking this in the Registry or your AppSettings file. If not, then Licensing doesn't change anything and returns False to say that it is not OK to run the app.
If the value is OK, then the method in your Licensing class would just return True to say that it is OK to run the app. There's no need to put up the CD Key entry form again.
You can get the first line of the file using:
Dim keyInFile As String
...
Using sr As New StreamReader(Path.Combine(Application.StartupPath), "serial.txt"))
keyInFile = fs.ReadLine()
End Using
|
|
|
|
|
You can't make this up. The good news is, this is a fair sign that no-one is going to steal his code....
Christian Graus
Driven to the arms of OSX by Vista.
Read my blog to find out how I've worked around bugs in Microsoft tools and frameworks.
|
|
|
|
|
Yeah, pretty much. He says he targeting the kids with the protection scheme, when it should be directed at the parents, if anyone at all.
|
|
|
|
|