Changes in MDAC ADODB COM components in Windows 7 Service Pack 1
Symptom:
=========
On a computer with Windows 7 SP1 installed, you develop and build your application that is using ADO for database access, you find the application doesn't run on the Windows XP, Windows Vista, Windows 7 without SP1. But it runs well on Windows 7 with SP1.
Cause:
=========
There is a by design change in ADO in Windows 7 SP1 that interfaces have new GUIDs.
The reason of this change is mentioned in KB983246(https://support.microsoft.com/kb/983246):
"Some ADO APIs are platform dependent in ADO 2.7 and later versions. On 64-bit versions of Windows, these ADO APIs process arguments by using a 64-bit data type (such as the LONGLONG data type). However, applications that use these APIs still use the LONG data type. Therefore, you receive a "Type Mismatch" error message when you try to run the macro."
The interfaces with new GUIDs (in Windows 7 SP1) don't have such issue.
This change causes a break that if your application is re-compiled on Windows 7 SP1 and it uses early binding to ADO, it probably doesn't work on down-level OSes, such as Windows 7 RTM, Vista, etc. Please note that this break only happens when the application is re-compiled. Existing applications should run on Windows 7 SP1 without any problems.
Solution:
========
If you have to re-compile your application on SP1, there are several solutions:
- Request a package of KB983246 and install it on your customers' machines. Re-compiled application should work after the package is installed.
- Re-write your application to use later binding to ADO, or use interfaces with name xxx_deprecated.
- Keep an old version of ADO typelib (i.e., msado28.tlb) (copy from Windows 7 RTM), then compile your application with the old typelib, instead of the one in your system.
- Open Regedit and locate the key HKEY_LOCAL_MACHINESOFTWAREWow6432NodeClassesTypeLib{2A75196C-D9EB-4129-B803-931327F72D5C}
- Right click, Permissions, Advanced, Owner, Change owner to Administrators, Click OK, OK
- Run C:WindowsMicrosoft.NETFrameworkv4.0.30319regtlibv12 -u "%CommonProgramFiles(x86)%systemadomsado28.tlb"
- Copy msado28.tlb from Win7 RTM/Win2008R2 RTM to your local machine, note the folder for the next step.
- Run C:WindowsMicrosoft.NETFrameworkv4.0.30319regtlibv12 "{path}msado28.tlb"
Edit: please refer to the knowledge base article kb2517589