Setting up the registry files
To register the components for use in 32 and 64 bit environments, we are going to need to modify the registry file we created in our test case. Open it with your favorite text editor. The entries should look something like this:
[HKEY_CLASSES_ROOT\YourAssembly.Class]
@="YourAssembly.Class"
[HKEY_CLASSES_ROOT\YourAssembly.Class\CLSID]
@="{YourClassGUID}"
Make sure that it includes "CodeBase"=
entries.
Do a global find/replace:
- Change
HKEY_CLASSES_ROOT
(which is aliasing to HKLMSoftwareClasses
)
- To
HKEY_CURRENT_USERSoftwareClasses
Copy all of the registry keys (and their values, which are listed below the keys) to a second text file. In the second text file:
- Delete all of the keys (and their related values) that do not contain
CLSID
- Do a global find/replace:
- Change
ClassesCLSID
- To:
ClassesWow6432NodeCLSID
Copy all of the keys from the second text file to your original .reg file, and save it.
Remove the registration entries from HKLM
by using regasm:
Regasm YourDLL.dll /unregister
Make sure things don't work
In order to make sure that our change worked (and that you're not just successful because of the registration you did with regasm originally), we need to make sure that VBA cannot create the object right now.
Open up your favorite VBA application, and add a reference to YourDLL.tlb
. Create a new procedure that is something like this:
Public Sub TestYourDLL()
Dim x as AssemblyName.ClassName
Set x = New AssemblyName.ClassName
Debug.Print "Apparently this worked."
End Sub
Run TestYourDLL
. You should receive the error:
Run-time error '429':
ActiveX component can't create object
(If you don't receive the error, your DLL is still registered.)
Save and exit your VBA application.
Making sure they work
Now, run the YourDLL.reg
that you created earlier to import the entries to the registry. (If you get an "Access denied" message, you forgot to change from HKEY_CLASSES_ROOT
to HKEY_CURRENT_USERSoftwareClasses
)
Open your VBA application again, and run TestYourDLL
. You should now see "Apparently this worked." in your immediate window. Congratulations! You've registered the DLL! (If you get an "Automation error: The system cannot find the file specified"-type error, your registry file is either missing the Codebase
entries, or they are not pointing to the actual location of your DLL.)
Additional steps
In my case, I'm going to be installing the DLL on a bunch of other users' computers alongside my application, so at installation time I'll update the CodeBase
value to refer to the location where I'm installing the DLL, and I'll also install the registry entries through code, rather than by executing the .reg file. But, now that I know the required entries, doing that is trivial.