From e21864225ae4fa0df400017b50d69e471d5d5e54 Mon Sep 17 00:00:00 2001 From: Francois Jacques Date: Thu, 26 Oct 2000 19:29:09 +0000 Subject: [PATCH] Updated the load process so that all typelibs (and not just the first one, as it used to) stored in a DLL can be loaded. --- dlls/oleaut32/typelib.c | 60 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 74d479a8e15..418b3325674 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -27,11 +27,10 @@ #include #include #include -#include +#include #include "winerror.h" #include "winreg.h" /* for HKEY_LOCAL_MACHINE */ #include "winnls.h" /* for PRIMARYLANGID */ -#include "wine/winestring.h" #include "ole.h" #include "heap.h" #include "wine/obj_base.h" @@ -1158,13 +1157,62 @@ int TLB_ReadTypeLib(LPSTR pszFileName, ITypeLib2 **ppTypeLib) int ret = E_FAIL; DWORD dwSignature = 0; HFILE hFile; + int nStrLen = strlen(pszFileName); + int i; + + PCHAR pszTypeLibIndex = NULL; + PCHAR pszDllName = NULL; TRACE("%s\n", pszFileName); *ppTypeLib = NULL; + /* is it a DLL? */ + for (i=0 ; i < nStrLen ; ++i) + { + pszFileName[i] = tolower(pszFileName[i]); + } + pszTypeLibIndex = strstr(pszFileName, ".dll"); + + /* find if there's a back-slash after .DLL (good sign of the presence of a typelib index) */ + if (pszTypeLibIndex) + { + pszTypeLibIndex = strstr(pszTypeLibIndex, "\\"); + } + + /* is there any thing after trailing back-slash ? */ + if (pszTypeLibIndex && pszTypeLibIndex < pszFileName + nStrLen) + { + /* yes -> it's a index! store DLL name, without the trailing back-slash */ + size_t nMemToAlloc = pszTypeLibIndex - pszFileName; + + pszDllName = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + nMemToAlloc + 1); + + strncpy(pszDllName, pszFileName, nMemToAlloc); + + /* move index string pointer pass the backslash */ + ++pszTypeLibIndex; + } + else + { + /* No index, reset variable to 1 */ + pszDllName = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + nStrLen + 1); + + strncpy(pszDllName, pszFileName, nStrLen); + + pszTypeLibIndex = "1\0"; + } + + TRACE("File name without index %s\n", pszDllName); + TRACE("Index of typelib %s\n", pszTypeLibIndex); + + /* check the signature of the file */ - hFile = CreateFileA( pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, -1 ); + hFile = CreateFileA( pszDllName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, -1 ); if (INVALID_HANDLE_VALUE != hFile) { HANDLE hMapping = CreateFileMappingA( hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL ); @@ -1192,11 +1240,11 @@ int TLB_ReadTypeLib(LPSTR pszFileName, ITypeLib2 **ppTypeLib) if( (WORD)dwSignature == IMAGE_DOS_SIGNATURE ) { /* find the typelibrary resource*/ - HINSTANCE hinstDLL = LoadLibraryExA(pszFileName, 0, DONT_RESOLVE_DLL_REFERENCES| + HINSTANCE hinstDLL = LoadLibraryExA(pszDllName, 0, DONT_RESOLVE_DLL_REFERENCES| LOAD_LIBRARY_AS_DATAFILE|LOAD_WITH_ALTERED_SEARCH_PATH); if (hinstDLL) { - HRSRC hrsrc = FindResourceA(hinstDLL, MAKEINTRESOURCEA(1), "TYPELIB"); + HRSRC hrsrc = FindResourceA(hinstDLL, MAKEINTRESOURCEA(atoi(pszTypeLibIndex)), "TYPELIB"); if (hrsrc) { HGLOBAL hGlobal = LoadResource(hinstDLL, hrsrc); @@ -1221,6 +1269,8 @@ int TLB_ReadTypeLib(LPSTR pszFileName, ITypeLib2 **ppTypeLib) } } + HeapFree(GetProcessHeap(), 0, pszDllName); + if(*ppTypeLib) ret = S_OK; else