What Great .NET Developers Ought To Know (More .NET Interview Questions)
A while back, I posted a list of ASP.NET Interview Questions. Conventional wisdom was split, with about half the folks saying I was nuts and that it was a list of trivia. The others said basically "Ya, those are good. I'd probably have to look a few up." To me, that's the right response.
Certainly I wasn't trying to boil all of .NET Software Development down to a few simple "trivia" questions. However, I WAS trying to get folks thinking. I believe that really good ASP.NET (and for that matter, WinForms) is a little [read: lot] more than just draging a control onto a designer and hoping for the best. A good race driver knows his car - what it can do and what it can't.
So, here's another list...a greatly expanded list, for your consumption (with attribution). I wrote this on a plane last week on the way from Boise to Portland. I tried to take into consideration the concerns that my lists contain unreasonable trivia. I tried to make a list that was organized by section. If you've never down ASP.NET, you obviously won't know all the ASP.NET section. If you're an indenpendant consultant, you may never come upon some of these concepts. However, ever question here has come up more than once in the last 4 years of my time at Corillian. So, knowing groking these questions may not make you a good or bad developer, but it WILL save you time when problems arise.
What Great .NET Developers Ought To Know
Everyone who writes code
- Describe the difference between a Thread and a Process?
- What is a Windows Service and how does its lifecycle differ from a "standard" EXE?
- What is the maximum amount of memory any single process on Windows can address? Is this different than the maximum virtual memory for the system? How would this affect a system design?
- What is the difference between an EXE and a DLL?
- What is strong-typing versus weak-typing? Which is preferred? Why?
- Corillian's product is a "Component Container." Name at least 3 component containers that ship now with the Windows Server Family.
- What is a PID? How is it useful when troubleshooting a system?
- How many processes can listen on a single TCP/IP port?
- What is the GAC? What problem does it solve?
Mid-Level .NET Developer
- Describe the difference between Interface-oriented, Object-oriented and Aspect-oriented programming.
- Describe what an Interface is and how it’s different from a Class.
- What is Reflection?
- What is the difference between XML Web Services using ASMX and .NET Remoting using SOAP?
- Are the type system represented by XmlSchema and the CLS isomorphic?
- Conceptually, what is the difference between early-binding and late-binding?
- Is using Assembly.Load a static reference or dynamic reference?
- When would using Assembly.LoadFrom or Assembly.LoadFile be appropriate?
- What is an Asssembly Qualified Name? Is it a filename? How is it different?
- Is this valid? Assembly.Load("foo.dll");
- How is a strongly-named assembly different from one that isn’t strongly-named?
- Can DateTimes be null?
- What is the JIT? What is NGEN? What are limitations and benefits of each?
- How does the generational garbage collector in the .NET CLR manage object lifetime? What is non-deterministic finalization?
- What is the difference between Finalize() and Dispose()?
- How is the using() pattern useful? What is IDisposable? How does it support deterministic finalization?
- What does this useful command line do? tasklist /m "mscor*"
- What is the difference between in-proc and out-of-proc?
- What technology enables out-of-proc communication in .NET?
- When you’re running a component within ASP.NET, what process is it running within on Windows XP? Windows 2000? Windows 2003?
Senior Developers/Architects
- What’s wrong with a line like this? DateTime.Parse(myString);
- What are PDBs? Where must they be located for debugging to work?
- What is cyclomatic complexity and why is it important?
- Write a standard lock() plus “double check” to create a critical section around a variable access.
- What is FullTrust? Do GAC’ed assemblies have FullTrust?
- What benefit does your code receive if you decorate it with attributes demanding specific Security permissions?
- What does this do? gacutil /l | find /i "Corillian"
- What does this do? sn -t foo.dll
- What ports must be open for DCOM over a firewall? What is the purpose of Port 135?
- Contrast OOP and SOA. What are tenets of each?
- How does the XmlSerializer work? What ACL permissions does a process using it require?
- Why is catch(Exception) almost always a bad idea?
- What is the difference between Debug.Write and Trace.Write? When should each be used?
- What is the difference between a Debug and Release build? Is there a significant speed difference? Why or why not?
- Does JITting occur per-assembly or per-method? How does this affect the working set?
- Contrast the use of an abstract base class against an interface?
- What is the difference between a.Equals(b) and a == b?
- In the context of a comparison, what is object identity versus object equivalence?
- How would one do a deep copy in .NET?
- Explain current thinking around IClonable.
- What is boxing?
- Is string a value type or a reference type?
- What is the significance of the "PropertySpecified" pattern used by the XmlSerializer? What problem does it attempt to solve?
- Why are out parameters a bad idea in .NET? Are they?
- Can attributes be placed on specific parameters to a method? Why is this useful?
C# Component Developers
- Juxtapose the use of override with new. What is shadowing?
- Explain the use of virtual, sealed, override, and abstract.
- Explain the importance and use of each component of this string: Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593777ae2d274679d
- Explain the differences between public, protected, private and internal.
- What benefit do you get from using a Primary Interop Assembly (PIA)?
- By what mechanism does NUnit know what methods to test?
- What is the difference between: catch(Exception e){throw e;} and catch(Exception e){throw;}
- What is the difference between typeof(foo) and myFoo.GetType()?
- Explain what’s happening in the first constructor: public class c{ public c(string a) : this() {;}; public c() {;} } How is this construct useful?
- What is this? Can this be used within a static method?
ASP.NET (UI) Developers
- Describe how a browser-based Form POST becomes a Server-Side event like Button1_OnClick.
- What is a PostBack?
- What is ViewState? How is it encoded? Is it encrypted? Who uses ViewState?
- What is the <machinekey> element and what two ASP.NET technologies is it used for?
- What three Session State providers are available in ASP.NET 1.1? What are the pros and cons of each?
- What is Web Gardening? How would using it affect a design?
- Given one ASP.NET application, how many application objects does it have on a single proc box? A dual? A dual with Web Gardening enabled? How would this affect a design?
- Are threads reused in ASP.NET between reqeusts? Does every HttpRequest get its own thread? Should you use Thread Local storage with ASP.NET?
- Is the [ThreadStatic] attribute useful in ASP.NET? Are there side effects? Good or bad?
- Give an example of how using an HttpHandler could simplify an existing design that serves Check Images from an .aspx page.
- What kinds of events can an HttpModule subscribe to? What influence can they have on an implementation? What can be done without recompiling the ASP.NET Application?
- Describe ways to present an arbitrary endpoint (URL) and route requests to that endpoint to ASP.NET.
- Explain how cookies work. Give an example of Cookie abuse.
- Explain the importance of HttpRequest.ValidateInput()?
- What kind of data is passed via HTTP Headers?
- Juxtapose the HTTP verbs GET and POST. What is HEAD?
- Name and describe at least a half dozen HTTP Status Codes and what they express to the requesting client.
- How does if-not-modified-since work? How can it be programmatically implemented with ASP.NET?
Explain <@OutputCache%> and the usage of VaryByParam, VaryByHeader. - How does VaryByCustom work?
- How would one implement ASP.NET HTML output caching, caching outgoing versions of pages generated via all values of q= except where q=5 (as in http://localhost/page.aspx?q=5)?
Developers using XML
- What is the purpose of XML Namespaces?
- When is the DOM appropriate for use? When is it not? Are there size limitations?
- What is the WS-I Basic Profile and why is it important?
- Write a small XML document that uses a default namespace and a qualified (prefixed) namespace. Include elements from both namespace.
- What is the one fundamental difference between Elements and Attributes?
- What is the difference between Well-Formed XML and Valid XML?
- How would you validate XML using .NET?
- Why is this almost always a bad idea? When is it a good idea? myXmlDocument.SelectNodes("//mynode");
- Describe the difference between pull-style parsers (XmlReader) and eventing-readers (Sax)
- What is the difference between XPathDocument and XmlDocument? Describe situations where one should be used over the other.
- What is the difference between an XML "Fragment" and an XML "Document."
- What does it meant to say “the canonical” form of XML?
- Why is the XML InfoSet specification different from the Xml DOM? What does the InfoSet attempt to solve?
- Contrast DTDs versus XSDs. What are their similarities and differences? Which is preferred and why?
- Does System.Xml support DTDs? How?
- Can any XML Schema be represented as an object graph? Vice versa?
About Scott
Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.
About Newsletter
I'm still trying to decide if I'm going to ask any of these sorts of questions in the interviews I'll be starting soon for a senior ASP.NET dev. I know I'm going to ask candidates to write code. I think I will end up asking a few of these as well. As usual Scott, you rock and you're just-in-time, too!
Kate
These lists are a nice way to gauge technical experience, but they lack any way to discover if a developer is truly a great developer. A truly great developer knows how to work well in a team. You ever have a developer who knew the answer to all these questions but would trash talk and degrade anyone who didn't (I've met one)? A truly great developer understands that construction is only a small portion of a project lifecycle.
Perhaps you'll meet someone who never had any opportunity to work at great projects and could never prove he could be a great developer. Those people might be(come) great developers, but until then they just were great at home. At home, you can do great things, that are totally worthless for the business. They might've created great software, which isn't divided into layers, etc, etc. I hope you get my point, I cannot express myself currently that good in English ;)
I still think it's a great list though. Peolpe who DO know these questions, can be considered great developers. You'll still have to figure out if they're great for your company and/or team. But when hiring them, you can start with a good salary. The other can prove himself later on and earn his big paycheck then.
I would move some question into another category, though.
For example:
Into "Everyone who writes code" category:
What is the difference between Dispose() and Finalize()
What is boxing ?
Is string a value or a reference type ?
Explain the use of virtual, sealed, abstract, override.
Explain the difference between public, private, protected and internal modifiers.
What is this ? Can it be used within static methods ?
Into "Mid-level developer":
What does this do? gacutil /l | find /i "Corillian"
Why is catch(Exception) almost always a bad idea?
Explain what’s happening in the first constructor: public class c{ public c(string a) : this() {;}; public c() {;} } How is this construct useful?
Into "Senior developer":
When would using Assembly.LoadFrom or Assembly.LoadFile be appropriate?
Moreover, I think some questions cannot be easily assigned to one of the developer-level categories.
For example, you can ask:
What is the difference between OOP and SOA ?
-- or --
Contrast the use of an abstract base class against an interface.
to all kind of developers, and the answer you'll get will be very different according to the developer's knowledge.
I personally think that a senior developer will prove its deep knowledge of the .NET technology if he can provide a good answer to the two questions above, rather than if he knows what sn- t foo.dll does :-)
However, thanks for the good list, I'm going to study/review a few topics after I relized I could not provide a good answer to some of your questions !
Claudio
The list is interesting, but I don't agree with your levels.
For example, "Can DateTimes be null?" or "Is string a value type or a reference type?" are things EVERYONE should know, because they are important to write code from day 0.
Also, I've been working for 3 years in .NET and never heard of Corillian. And, while I know what PIDs are, I don't think everybody needs them.
There are a lot of examples, but I think these ones are representative enough.
thinking in using such lists lets talent slip through the cracks.
Einstein said to never memorize anything you can look up, so knowing
what gacutil /l | find /i "Corillian" does would, for me, start with
gacutil /?. I would guess that it would list all of Corillian's
assemblies in the gac, but I've never used gacutil before. Granted
I'm not a "great" .Net developer, just one learning to hopefully be
great one day.
Often times in the NFL quarter backs change teams and/or have to work
with new offensive cooridinators who have totally different offenses
than what the quarterback knows. If they brought in the quarterback
for an interview and started quizzing him on plays from their playbook
that he hadn't seen before, he could end looking terrible. However,
does he have the fundamental skills required by an NFL quarterback?
If so then he can probably quickly learn the new offense and be a
great player for the team.
Having said all of that, I'm going to learn everything on the list ;)
Hard to overemphasize this point. One question I always ask in interviews goes something like this: "You've been told by the project sponser that the project absolutely has to be done in two months - commitments to major clients have been made, etc. etc. You know that's impossible, and that a minimum of six months will be needed. What do you do?"
There are several reasonable answers to this, depending on circumstances. But the tone and quality of the answer will tell you a lot about this person's understanding of the software development process.
Or if I were choosing between:
A) a young, motivated developer who can't answer the list very well, but has a great attitude and seems to have a good potential to learn
B) a whiz kid who knows all the answers but has the people skills of a snapping turtle and can give you a thousand reasons why everything that's ever gone wrong in his projects are "somebody else's fault"
I'm picking A every time.
It's more like "how many years until all the developers in India memorize this list"?
What you should be asking is, "can I come up with a list like this?" Being able to answer all the questions is a red herring-- it won't save your job. People with the ability to *CREATE* the lists are the ones who will keep their jobs.
#1 I tell the project sponsor "No Problem!" and then quit the day before it's due to be delivered to QA."
#2 I tell the project sponsor "No problem. I've fortunately have the ability to bend space and time to conform to your warped sense of reality."
#3 I tell the sponsor to perform an anatomically impossible act and start verbally abusing the sales team.
#4 From that day forth, I would only speak in a long dead language like Aramaic and point fingers at my coworkers.
Be sure to give one of these answers in your next interview.
But some don't have as many options as others, and some may not be ready to write off an otherwise good position for one impossible demand. While we may gain some satisfaction using the flip answers #2 and #3 among ourselves, we have to face the fact that those outside the process simply lack the perspective to understand the limitations of software development. So attempts at education, while not succeeding as often as I'd like, are not totally pointless.
But I think we're probably close together in general concept, and here's a test to see. About three years ago, I ran across a book in a bookstore entitled "How to Survive a Death March Project". I started to pick it up, thinking, "I might get some interesting tips out of this." Then I came to my senses and put it down, realizing that I am NEVER going to allow myself to be involved in such a project again. Life's too short for such nonsense. In that in line with your thinking?
http://www.devcow.com/weblogs/PermaLink,guid,bf5f8170-969d-4e73-b2d2-86139ae8efed.aspx
http://www.ayende.com/Blog/PermaLink,guid,b6e3e8ce-4a6e-4cf0-af70-d360be9e8c76.aspx
1. How does she solve problems (as opposed to how does she regurgitate facts)?
2. How does she interact with others?
3. How does she deal with adverse situations?
4. How well does she communicate?
5. How well does she perform under pressure?
etc.
There are numerous factors that outweigh an individual's ability to memorize. Of course, knowing the answers to a set of questinos is useful since it *could* indicate experience in the topic area, but it is by no means a gauranteed method of finding a well rounded developer.
* Can attributes be placed on specific parameters to a method? Why is this useful?
* What is cyclomatic complexity and why is it important?
* What does this do? gacutil /l | find /i "Corillian"
------------------
I have a question of my own that I've asked many sr. developers and friends and coworkers and architects but thus far, I haven't recieved the correct answer. If you look this up or try it out before you answer than you've cheated < giggles >.
In C#, what is the difference between passing an object by ref and by value? (Yes, there is an important difference, a difference that has caused days of debugging because of pre-disposed assumptions we have about it).
... No cheating. Whats the answer? ... Scott? Anyone? I'll post the answer in my next post.
First, Charles Chen sums up my sentiments quite well. I like to measure technical ability but teamwork is very important. Sometimes I have to compromise because good developers with a good attitude are very difficult to find, but for higher level positions its a requirement and there is no compromise.
I recently went to a new company (2 months ago) to be an archict and the Software Direct I reported to started when I started, but he had a very demeaning attitude and lots of micromanagement. When confronted about being micromanaged, he said if I don't like it I can leave. Well, I left and returned to my previous company (which I started at yesterday). He's been programming for 30 years. I've been doing it for only 15 (8 professionally, I don't could C-64/Apple IIe hacking professional).
When I interview, I put much less emphasis on what they know than I do on how they present themselves and how they solve problems and interact with other members of the team. Of course, I've not hired people before because I couldn't guage how they were technically because there is a certain minimum competance I expect. I don't want cowboys that will come in and do things their way or no way and re-write all the code because its not what they are used ito.
Anyway... the answer to my question above:
In C#, if you pass an object byval and set it to null, you are setting a copy of the pointer to null and not the object itself (being passed in). If you pass as ref, then set it to null in the function, then you are setting the actual pointer to null and everything else that points to it. In both cases your are passing a pointer into the function, but in one case you are passing the pointer itself, or a copy of the pointer. I don't think this is the same behavior in VB.NET but I haven't tested it.
The question you asked is a mid-level to everyone-should-know question. VB.NET has similar semantics.
For starters, if someone did actually know the answers I WOULD NOT hire them. They would probably be a total wet noodle book worm with no interpersonal skills and creativity.
Also, there is nothing that would relate to real-world problem.
Also, most companies would not hire such a person that knew all the answers. He/she would probably want more money than what the job paid. He/she should work for MSFT or just write arcane books.
Oh, and BTW, most of these questions are trival information to make the author sound smart.
I'm glad the list makes me sound smart. It wasn't the intent, but a nice side effect according to you.
Thanks also for indicating the triviality of the list - I look forward to your follow-up posting of the answers.
While I'll agree, the question isn't very advanced, but I've asked more people than I can count (I've guestimate) 50 or so over the last year and not one person has correctly answered the question. You didn't even answer it. And the terminology "pointer" I'll concurr is incorrect, old habbits die hard. Nonetheless, most people answer the question (in fact, I've even seen it in an MCSD study guide in the past this way too) that when you pass an object it passes a reference to the object (which is correct). But it never makes the distinction that if you pass an object as ref and set it to null in the method that you are actually setting the object to null everywhere (even outside the method) and if you pass it by value then you are only setting the local copy to null.
While everyone should know it, I've yet to encounter someone who has answered it correctly. You might be the exception (not being synical here) but everyone in person I've asked (which isn't many I'll admit) hasn't gotten it (even some prominant people in the community).
Concerning Ed., I'm glad to know you wouldn't hire me because I probably wouldn't want to work for you (or someone with the attitude your project in your post). I could answer them and I guarantee I'm not being paid anymore than I'm worth but I won't accept a Jr. developers wage, either... I'm well beyond Jr. and can demonstrate very quickly.
I don't view these questions as a end-all-be-all for determining anything in an interview. But just because someone can answer them doesn't mean they have no interpersonal skills. When I interview, I dig deeper into the personality and teamwork skills than I do technical, unless they are applying for a technical position (Architect?). I expect people to know there stuff, I guage that by a mix of questions (like these posted) and problem solving and hands on troubleshooting.
While I disagree with the idea of this kind of list, I don't think that Scott is using this as his only criteria during an interview. At least I hope not. The big problem I have with these types of lists is that they are just facts devoid of context and don't provide any insight into a persons thought process (how hippie-esque of me to want insight into someones thought process).
I don't think it's nit-picky to correct someone who says "pointers" instead of "references" wrt .NET variables. ESPECIALLY if that someone had plastered ".NET Expert" on their resume as it's sitting in front of me. It's like calling your wife "my girlfriend". Although the two titles are similar, there is a WORLD of difference between the two. :)
For a truly useful hiring guide, check out http://www.joelonsoftware.com/articles/fog0000000073.html
I also disagree with the basic premise that a great .NET developer ought to know these things. I'd rather have a problem solver than a Jeopardy! champ on my team any day.
You guys miss the point (and you didn't see Scott's PREVIOUS list, which was FAR more Jeopardy-like, but I digress).
I don't think Scott is saying that every .NET developer should know the answer to *all* these questions.
A .NET developer working in these areas should have run into the topics covered by these questions, enough to at least understand the question and provide a reasonable response. That implies that they're thinking about what they are doing and asking "why does it work this way?" and "what other ways could I do this?"-- and that's much more useful. Those are the people you want to hire.
I talk more about this here:
http://www.codinghorror.com/blog/archives/000220.html
Ring a bell?
The kinds of people who are likely to know the answer to more of these questions that the average joe are likely to be the kinds of people who have to constantly know how things work at a deep level, people who don't just do it because its a job, but rather a passion. I can't speak for everyone on that so don't take it as an over-generalization. I realize good people can be swamped.
I guess my point is that I wouldn't be scared if someone knew all the answers. But really, what is more important than anyone who can answer the questions, is how well they work on a team, their attitude, and how they approach problem solving (especially complicated problems). However, whether they read the answers in a book or learned it by experience, is somewhat minor. Some of what I know I read in books and trade magazines and online. Much of what I know I learned by experience. At some point, what I've learned will connect with what I'm actually doing. In many cases, what I've learned by reading but not doing, I've been able to assist other people in their problem solving.
What's important is that they understand conceptually (with regards to answering a list of questions) and not by fact-memorization otherwise indeed, the knowledge would be mostly useless.
But with all interviews questions, they shouldn't be the reason for hiring/not hiring, but only as a guide. There are so many more aspects to measure in a candidate than technical ability. I would even hire someone who couldn't answer most of these questions, if they were an otherwise motivated, good-attitide person, and want to achieve more than they can imagine. After all, that sounds a lot like me and I've accomplished some amazing things. And some of those things I accomplished while not being able to answer any of these questions. At some point we need to learn, and we are always learning because no one knows it all.
Does something to the strong name of the dll, probably show you the details of it, don't recall sn's CUI in my head. " This is a GREAT answer. It shows that you at least know what sn is for, and that backs up your claim that you're an enterprise .NET developer (well if you had no idea what sn was, or couldn't show me that you did, should I hire you?) If the person went on to say "I can fire up a dos box and go sn ? to see the options" then that shows me the person has actually used sn at least once (knows it runs at a command prompt) and knows how to look stuff up. That's actually different than someone who says they would Google for it.
Hire for attitude, train for skills... but the attitudes I want include "fast learner", "excited by our technologies", "knows where to look stuff up" and "remembers a lot of details." These questions serve as an opportunity to illustrate those attitudes.
Here's another example: during a code review of an ASP.NET system, you discover that a number of different pages are storing unrelated values in viewstate under the key "id". For example one page puts the customer is in viewstate("id"), another the employee id, and so on. What would you recommend be done?
How a candidate answers this will reveal technical experience as well as team dynamics and what kinds of process they like.
<-- will never get hired by Scott H now. ;)
I picked two basic questions from your blog yesterday and asked them of an interviewee at my company. I asked him the difference between a process and a thread. He went, "Well, you know... there are so many classes in .NET Framework..." As you can tell by now, the guy didn't get the job. Of course, that's not the only reason why we didn't hire him, but I didn't like the fact that he didn't even attempt to answer the question. And it seems to be a very basic question to me if you have a B.S. degree in computer science, which his resume stated. (I have B.A. degree in education...)
I picked two basic questions from your blog yesterday and asked them of an interviewee at my company. I asked him the difference between a process and a thread. He went, "Well, you know... there are so many classes in .NET Framework..." As you can tell by now, the guy didn't get the job. Of course, that's not the only reason why we didn't hire him, but I didn't like the fact that he didn't even attempt to answer the question. And it seems to be a very basic question to me if you have a B.S. degree in computer science, which his resume stated. (I have B.A. degree in education...)
http://www.vbaspcoder.com/PermaLink,guid,dc1d767c-f102-4747-aaa6-6e09c3bf98be.aspx
You can usually teach people most of these technology skills anyway if they lack them, it is much harder to teach them general problem solving skills that stand the test of time.
Scott Berkun gives a different view of what to ask in this essay: http://www.scottberkun.com/essays/essay39.htm
Follow this and you are more likely to get at a candidates soft skills which are so important when building a team.
Until your organization begins to select people on the basis of their ability to *invent*, and *imagine* a creative solution to an open-ended question, it will be more of the same old, same old.
Face it: "great .NET developer" is as much of an oxymoron as "Windows XP Security". Great developers don't tolerate the platform on which .NET runs.
Obviously typeof operates on types and .GetType() works for instances but is there anything else? Something more magical? I'm hoping typeof() is quicker because it *could* be evaluated at compile time or something?
Understanding processes and architectures are key, not specific questions on xml libraries for eg.... because they are always in flux.
I have an interview next week. Can you please post some sample interview questions on .NET? I found a few sites below that have some questions, but need a few more samples to feel confident!
http://techinterviews.com
http://www.interviewboard.com
Thanks.
- Prashant
i have an interview next week..
let me ask u these questions (to clear my mind :) )
which one of these will u prefer as an answere from an interviewee:
1> Textual answere
2> Practical answere
3> Mixture of both
4> or a confident bluff (not always, but at some instances)
what impresses u most in an interviewee?
attitude( &/or confidence) or knowledge level
How was ur first interview? ( ;) )
(well , i cant think of anymore questions right now, i will be asking as soon as they come ;) )
i think the questions framed are good and covers most of the knowledge level one expects from a s/w developer (at their specific levels)
Comments are closed.
So, while such lists have value, an interviewer should not read too much into a person's lack of knowledge about one specific area. Heck, the reason I'm not working for Microsoft today is that a gearhead C++ guy didn't think I knew enough about the Windows API. (He asked a question about accessing an API function, and I told him I did that a couple of years back, wrapped it up in a VB function, and never thought about it again. That was evidently not the answer he wanted.)