From c6c25a442f0b9e2c9c0f3c0751f4f4a559271a12 Mon Sep 17 00:00:00 2001 From: Damjan Jovanovic Date: Thu, 29 Oct 2009 20:55:52 +0200 Subject: [PATCH] sti: Marshal WIA COM interfaces. --- .gitignore | 2 ++ dlls/sti/Makefile.in | 8 +++++++- dlls/sti/regsvr.c | 15 +++++++++++---- dlls/sti/sti_main.c | 21 +++++++++------------ dlls/sti/sti_wia.idl | 19 +++++++++++++++++++ 5 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 dlls/sti/sti_wia.idl diff --git a/.gitignore b/.gitignore index 50aa0b3b4cc..79499d88a83 100644 --- a/.gitignore +++ b/.gitignore @@ -117,6 +117,8 @@ dlls/rpcrt4/tests/server_s.c dlls/shdocvw/shdocvw_v1.tlb dlls/stdole2.tlb/std_ole_v2.tlb dlls/stdole32.tlb/std_ole_v1.tlb +dlls/sti/sti_wia.h +dlls/sti/sti_wia_p.c dlls/user.exe16 dlls/wprocs.dll16 include/activaut.h diff --git a/dlls/sti/Makefile.in b/dlls/sti/Makefile.in index 5bc46bc1d65..247c1e19a17 100644 --- a/dlls/sti/Makefile.in +++ b/dlls/sti/Makefile.in @@ -4,13 +4,19 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = sti.dll IMPORTLIB = sti -IMPORTS = uuid ole32 advapi32 kernel32 +IMPORTS = uuid ole32 oleaut32 rpcrt4 advapi32 kernel32 +EXTRADEFS = -DENTRY_PREFIX=STI_ -DPROXY_DELEGATION -DREGISTER_PROXY_DLL C_SRCS = \ regsvr.c \ sti.c \ sti_main.c +IDL_P_SRCS = \ + sti_wia.idl + +EXTRA_OBJS = dlldata.o + @MAKE_DLL_RULES@ @DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/dlls/sti/regsvr.c b/dlls/sti/regsvr.c index 018c1781ef6..3e582ec4964 100644 --- a/dlls/sti/regsvr.c +++ b/dlls/sti/regsvr.c @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ - #include #include @@ -31,6 +30,7 @@ #include "objbase.h" #include "initguid.h" #include "sti.h" +#include "wia_lh.h" #include "wine/debug.h" #include "wine/unicode.h" @@ -395,8 +395,11 @@ static struct regsvr_interface const interface_list[] = { { NULL } /* list terminator */ }; +extern HRESULT WINAPI STI_DllRegisterServer(void) DECLSPEC_HIDDEN; +extern HRESULT WINAPI STI_DllUnregisterServer(void) DECLSPEC_HIDDEN; + /*********************************************************************** - * DllRegisterServer (INETCOMM.@) + * DllRegisterServer (STI.@) */ HRESULT WINAPI DllRegisterServer(void) { @@ -404,14 +407,16 @@ HRESULT WINAPI DllRegisterServer(void) TRACE("\n"); - hr = register_coclasses(coclass_list); + hr = STI_DllRegisterServer(); + if (SUCCEEDED(hr)) + hr = register_coclasses(coclass_list); if (SUCCEEDED(hr)) hr = register_interfaces(interface_list); return hr; } /*********************************************************************** - * DllUnregisterServer (INETCOMM.@) + * DllUnregisterServer (STI.@) */ HRESULT WINAPI DllUnregisterServer(void) { @@ -422,5 +427,7 @@ HRESULT WINAPI DllUnregisterServer(void) hr = unregister_coclasses(coclass_list); if (SUCCEEDED(hr)) hr = unregister_interfaces(interface_list); + if (SUCCEEDED(hr)) + hr = STI_DllUnregisterServer(); return hr; } diff --git a/dlls/sti/sti_main.c b/dlls/sti/sti_main.c index 4e91698c372..7568589c6ec 100644 --- a/dlls/sti/sti_main.c +++ b/dlls/sti/sti_main.c @@ -32,6 +32,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(sti); +extern HRESULT WINAPI STI_DllGetClassObject(REFCLSID, REFIID, LPVOID *) DECLSPEC_HIDDEN; +extern BOOL WINAPI STI_DllMain(HINSTANCE, DWORD, LPVOID) DECLSPEC_HIDDEN; + typedef HRESULT (*fnCreateInstance)(REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj); typedef struct @@ -130,16 +133,9 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("(0x%p, %d, %p)\n",hInstDLL,fdwReason,lpvReserved); - switch(fdwReason) { - case DLL_WINE_PREATTACH: - return FALSE; - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hInstDLL); - break; - case DLL_PROCESS_DETACH: - break; - } - return TRUE; + if (fdwReason == DLL_WINE_PREATTACH) + return FALSE; + return STI_DllMain(hInstDLL, fdwReason, lpvReserved); } /****************************************************************************** @@ -156,8 +152,9 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) cf = (IClassFactory *)&the_sti_cf.vtbl; } - if (!cf) return CLASS_E_CLASSNOTAVAILABLE; - return IClassFactory_QueryInterface( cf, iid, ppv ); + if (cf) + return IClassFactory_QueryInterface( cf, iid, ppv ); + return STI_DllGetClassObject( rclsid, iid, ppv ); } /****************************************************************************** diff --git a/dlls/sti/sti_wia.idl b/dlls/sti/sti_wia.idl new file mode 100644 index 00000000000..aaac943445f --- /dev/null +++ b/dlls/sti/sti_wia.idl @@ -0,0 +1,19 @@ +/* + * Copyright 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wia_lh.idl"