Holy cow, I wrote a book!
A customer asked for help installing a particular DLL.
They ran the command
regsvr /i SomeDll.dll but got the error
"SomeDll.dll was loaded, but the DllInstall entry point was not found.
This file can not be registered."
regsvr /i SomeDll.dll
A DLL needs to be specifically written to be used with
the regsvr32 command.
You can't just grab some random DLL and expect
regsvr32 to work.
As we saw last week,
the regsvr32 program merely loads the specified DLL
and calls an entry point established by convention.
If the DLL was not written to be used with regsvr32
then the conventional entry point will not be found, and you get
an error message.
The /i switch to regsvr32 instructs
the program to look for
the entry point known as DllInstall.
By convention, the DllInstall function performs installation
and setup of a DLL, but since it's just some function exported by a DLL,
it could do anything it wants (or nothing at all).
You can't just
grab a random DLL and expect regsvr32
to do anything meaningful with it.
The DLL has to be designed to operate with regsvr32.
Handing random DLLs to regsvr32 is like dialing a
random telephone number,
sending a tone at 1170Hz
and getting upset when you don't
get a 2125Hz tone in response.
The number one hit for a search on
what does regsvr32 do is an
old Knowledge Base article which
explains what regsvr32 does,
and it even contains a sample program which emulates
regsvr32 so you can use it to debug your DLL.
(The sample program hasn't been updated to support the /i
which I leave as an exercise.)
One day, I received a piece of email from another employee
whom I had never met nor had ever heard of.
It didn't even begin with an introduction; it just jumped right in
as if we'd been friends for years.
"I'm trying to debug a problem where regsvr32 cannot register
It gives the error 'The specified procedure could not be found.'
I saw a blog entry written by you and am trying to understand
what our problem is."
This blog thing has backfired.
The reasons I write these articles is to get people to
stop asking me questions.
(The mechanism for that being to give the answer out in public
for everyone to see.)
Instead, it turns into
"Hi, I found an article you wrote about X,
which ipso facto makes you not only
the world's foremost authority on X,
but also the world's leading support technician on X."
a blog entry about something on the Internet
should not be taken as evidence that the author is an expert
on that subject.
(One might argue that it in fact is more likely to be the opposite.)
At the time, I wasn't aware of the knowledge base article that
explains what regsvr32 does and how to debug it,
so I couldn't point to it.
I wrote back,
"All regsvr32 does is LoadLibrary,
GetProcAddress, and then calls the function.
You can write your own test that does the same thing.
You do not require any expertise from me."
Less than an hour later, I received a reply:
I figured it out.
There was an older version of the DLL in the path ahead of the
one I was trying to register."
And I never did figure out which blog entry I wrote that
made them think I was an expert on regsvr32.
Maybe the person worked in Microsoft Research and used
a prototype of
their machine that predicts the future,
and used it to predict that I was going to write about
regsvr32 two years later.