Windows: Show more useful DLL load errors to say exactly what DLL is missing (#24053)
### Description
When we fail to load a provider shared DLL in windows, the error is not
very specific. Users have to figure out if the onnxruntime file is
missing, a cuda file, or cudnn is not installed (and perhaps others).
And this is just the cuda provider. It would be far more useful if it
would say exactly what file is missing so the user can fix the actual
problem.
Plus, this will likely result in many fewer github issues regarding this
problem, but if they do, they will be much easier to fix.
This fix adds a function that will try loading a dll and its
dependencies recursively to figure out which file is missing. It uses
the OS dbghelp library to do it and is not very complex.
This also fixes a many year old bug that was introduced in the change to
use FormatMessage in env.cc, where the system error would always be an
empty string `error 126 ""` due to passing 0 as the format buffer
length. We will now see the more useful `The specified module could not
be found.` style error messages.
### Motivation and Context
Previously if we fail to load the cuda provider, the error would look
like this, which is limited:
`unknown file: error: C++ exception with description "
onnxruntime::ProviderLibrary::Get [ONNXRuntimeError] : 1 : FAIL :
LoadLibrary failed with error 126 "" when trying to load
"C:\Example\Path\To\Library\onnxruntime_providers_cuda.dll"`
Now it will look like this if cudnn is not installed:
`unknown file: error: C++ exception with description
onnxruntime::ProviderLibrary::Get [ONNXRuntimeError] : 1 : FAIL : Error
loading "C:\Example\Path\To\Library\onnxruntime_providers_cuda.dll"
which depends on "cudnn64_9.dll" which is missing. (Error 126: "The
specified module could not be found.")`
If cuda is not installed:
`unknown file: error: C++ exception with description
onnxruntime::ProviderLibrary::Get [ONNXRuntimeError] : 1 : FAIL : Error
loading "C:\Example\Path\To\Library\onnxruntime_providers_cuda.dll"
which depends on "cudart64_12.dll" which is missing. (Error 126: "The
specified module could not be found.")`
And if onnxruntime_providers_cuda.dll is not installed:
`unknown file: error: C++ exception with description
onnxruntime::ProviderLibrary::Get [ONNXRuntimeError] : 1 : FAIL : Error
loading "C:\Example\Path\To\Library\onnxruntime_providers_cuda.dll"
which is missing. (Error 126: "The specified module could not be
found.")
`