I think your approach is peachy, but Alexandre wanted a version
check; look at his most recent post in this thread:
... The version of the native dll, compared to the
builtin. I could imagine
a heuristic where if the major version of native is higher than builtin
you default to native or something like that. I'm sure there are other
possibilities too.
On Fri, Oct 16, 2009 at 8:10 PM, Jeremy White <jwhite(a)codeweavers.com> wrote:
I think we never pursued the question Dan posed in
this subject line.
That is, Powerpoint 2007 makes the following call:
Call KERNEL32.LoadLibraryA(0033c0a8 "C:\\Program Files\\Common
Files\\Microsoft Shared\\office12\\riched20.dll")
It's clearly trying to load it's private dll. Instead of loading that
private copy, we
load the builtin riched20 instead. The builtin isn't 'good enough', and
Powerpoint fails.
Isn't that wrong? Shouldn't we prefer an explicitly referenced native dll
to a builtin,
even in builtin,native load order?
The attached proof of concept patch allows Powerpoint to display the
troubled
presentation.
If I am on the right track, does it make sense to add a conformance test
to create a bare bones %TEMP%\riched20.dll and load it?
Cheers,
Jeremy
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 71d7ecd..ef66b50 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -1977,6 +1977,9 @@ static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR
libname, DWORD flags, WINE_
case LO_DEFAULT: /* default is builtin,native */
nts = load_builtin_dll( load_path, filename, handle, flags, pwm );
if (!handle) break; /* nothing else we can try */
+ /* file is not a builtin library, if we we have a real file, try
native */
+ if (nts == STATUS_INVALID_IMAGE_FORMAT && handle && loadorder
!=
LO_BUILTIN)
+ nts = load_native_dll( load_path, filename, handle, flags, pwm
);
/* file is not a builtin library, try without using the specified
file */
if (nts != STATUS_SUCCESS)
nts = load_builtin_dll( load_path, filename, 0, flags, pwm );