not that the program would continue running, just that it would have the opportunity to gracefully crash, and report that it is missing a particular control file.
Main Topics
Browse All TopicsHi,
How would you write a 'generic' error handler, that captures missing components?
Because otherwise the program just barfs on you and exits.
For example, say you had a commonDialog control (comctl.ocx), but forgot to package
it and shipped it to a client without it (say a clean install). If you tried to run the software,
the program would just exit/crash, rather than continue running -- saying it was missing
a component and couldn't continue. How would you set it up such that if you had a missing
component, your program could still run?
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
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.
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.
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.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
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.
I tried that once, and I think the only thing I was able to really pull off was to create a separate exe that on startup read a table of components/dll's and use fso to validate that they were on the user's pc, with a file date >= the version I needed's file date. Assuming that everything checked out, this exe opened my actual exe application, then ended.
WhizzyDoodad = I learned a new word today...
The only "good way" that you can hadle an Error is to write an "Error Handler" for every X every Sub.
If you whant to avoid "Thinking about every Error that might happend" then I suggest that you use one of these:
1.
Sub BlaBla()
On Error Resume Next
'YourCode gos here
End sub
2.
Sub BlaBla()
On Error GoTo ErrHand
'Your Code Gos Here
Exit Sub
ErrHand:
MsgBox Err.Number & VbNewLine & Err.Description
Err.Clear
Resume Next
End Sub
Shoot, I had a long thing typed here, but MSIE crapped out on me.
Basically I said thanks, good idea, but could you please post an example? Specifically testing the existance/'workability' of the Microsoft HTML Object Library (that can be added in the references section). For the logging idea, good idea -- and I think I will use that for people (in the event that it is necessary) that contact me.
Thanks & look forward to hearing from you.
Well, thats a bit of a specific doozy, as the MSHTML reference is MSHTML.TLB which is not an OCX or DLL control or reference object.
Specifically, MSHTML.TLB is a component of IE itself, and I believe that it is for version 5.0 + of IE. So in this case, you can say that you have a requirement that the system have IE 5.0 or higher installed. Its a bit hard to simulate a case where that is not installed on a system in order to make an example. Unregistering a component, that can simulate to some degree the effect of not having that component available, but the MSHTML object model can't be unregistered.
>>say you had a commonDialog control (comctl.ocx)
Use as less non-standard controls as you can. You can implement everything a 3rd-party control can through VB and won't have to worry about the references.
For the CommonDialog control, for example, you can use API to easily achieve the same functionality. A 30KB module can handle displaying ChooseFile, ChooseFont, and ChooseColor just as good (if not better) than the control can. Another example, the Winsock control, there are substitutions for it such as cSocket or cSocketMaster (primarily classes with a module or two.. free and royalty-free).
For controls you really must use, you can use late-binding, but it's not as efficient. Instead of including a direct reference to it in VB (that will cause a crash if it's not on the system), you can create an instance of the object via CreateObject() and if it doesn't exist, you can trap the error with On Error statements.
For example, if I wish to use the Inet control:
Dim inet As Object
Dim buff As String
Set inet = CreateObject("InetCtls.Ine
buff = inet.openurl("http://www.y
MsgBox buff
The ProgIDs are global (to every computer) and can be retrieved via the registry. In this case:
HKEY_CLASSES_ROOT\CLSID\{4
For your MSHTML concern, it's a high standard that most users have a current version of IE installed. Most applications rely on it.. such as AIM, Yahoo, and probably MSN.
I don't get it, if you are using a control in your program so when you are making the "Package & Deployment Wizard" you can see, at the list, all the component, OCX, DLL and so that you gona' need. Even if you gona' use different installer (like I do with "Inno Setup") I always check whats on the list so I won't miss it...
One trick I use is to place all of my OCX controls on a temp form, then in my main module I put an ON ERROR RESUME NEXT in place, load that temp form and then test to see that all the objects are accessable.
This lets me give a user friendly error message to the user and also log the error. If the controls were on the main form and I just load it, errors are hard to trap in a user friendly way.
Business Accounts
Answer for Membership
by: GPrentice00Posted on 2005-12-24 at 19:54:22ID: 15548265
Have a module-based startup rather than form - form controls will crash upon initialization of the form.
In the startup, do some tests with error-handling: try to create an object instance, via
dim testobject as controlfileobject
or via a CreateObject() or similar method...
Throw some flags in for good measure around the code.
Destroy the object after creating.
In the routine, if the object instantiation causes it to toss an error, catch it in the error-handler part.
Various control files will result in different runtime errors, but primarily 426/429 etc are quite common.
Knowing what error would be tossed out is a big help, as you can error-check for that error number, but
if also knowing that some flag value indicates that it made it past the first few commands but not the 4th
command in a procedure, then it had to crap out on that 4th command, so if it was trying to create an instance
of a WhizzyDoodad, then you know that the ocx containing the WhizzyDoodad control isn't there.
Some controls can only be tested by loading a form, so create a test form in the project that will load but be
invisible - if you plunk a commondialog control on the form and its ocs file isn't on the system, when that form
is instanciated, it too will toss activex runtime errors (426), so simply that trying to load up the test form fails
to complete error free indicates the lack of control - not 100% sure about common dialog controls, it may load the
form without crashing but certainly setting a parameter like the .InitDir or somthing would crash it.
Certainly for things like progress bars and sliders, if the ocx file housing those controls is missing, it craps out.
A little trial and error for the specific controls may be required, but the concept is the same.
But definitely, make sure that a form is not the startup object / form procedure startup routine, else if the
form controls crap out, you won't execute any code other than in the form initilize (or is it activate?) event - before
the form load, but when of little value for detecting anything.
For user-friendliness, speed efficiency, you can record in registry or ini file, or some other means, that if the
program fired up no problems, then it can skip the tests for the rest of time... depends on how many milliseconds the
tests consume and you want to shave off.