diff --git a/reactos/dll/win32/sti/CMakeLists.txt b/reactos/dll/win32/sti/CMakeLists.txt index 99bbb72ad7e..e2df6528175 100644 --- a/reactos/dll/win32/sti/CMakeLists.txt +++ b/reactos/dll/win32/sti/CMakeLists.txt @@ -6,38 +6,23 @@ add_definitions( -D__WINESRC__ -DENTRY_PREFIX=STI_ -DPROXY_DELEGATION - -DREGISTER_PROXY_DLL) + -DWINE_REGISTER_DLL) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) spec2def(sti.dll sti.spec) list(APPEND SOURCE - regsvr.c sti.c sti_main.c + sti.rc ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c ${CMAKE_CURRENT_BINARY_DIR}/sti_wia_p.c ${CMAKE_CURRENT_BINARY_DIR}/sti.def) add_rpcproxy_files(sti_wia.idl) - add_library(sti SHARED ${SOURCE}) - set_module_type(sti win32dll) - -target_link_libraries(sti - wine - uuid - ${PSEH_LIB}) - -add_importlibs(sti - ole32 - oleaut32 - rpcrt4 - advapi32 - msvcrt - kernel32 - ntdll) - +target_link_libraries(sti wine uuid ${PSEH_LIB}) +add_importlibs(sti ole32 oleaut32 rpcrt4 advapi32 msvcrt kernel32 ntdll) add_cd_file(TARGET sti DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/sti/regsvr.c b/reactos/dll/win32/sti/regsvr.c deleted file mode 100644 index 3e582ec4964..00000000000 --- a/reactos/dll/win32/sti/regsvr.c +++ /dev/null @@ -1,433 +0,0 @@ -/* - * self-registerable dll functions for sti.dll - * - * Copyright (C) 2003 John K. Hohm - * Copyright (C) 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 -#include - -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winreg.h" -#include "winerror.h" -#include "objbase.h" -#include "initguid.h" -#include "sti.h" -#include "wia_lh.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -WINE_DEFAULT_DEBUG_CHANNEL(sti); - -/* - * Near the bottom of this file are the exported DllRegisterServer and - * DllUnregisterServer, which make all this worthwhile. - */ - -/*********************************************************************** - * interface for self-registering - */ -struct regsvr_interface -{ - IID const *iid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - IID const *base_iid; /* can be NULL to omit */ - int num_methods; /* can be <0 to omit */ - CLSID const *ps_clsid; /* can be NULL to omit */ - CLSID const *ps_clsid32; /* can be NULL to omit */ -}; - -static HRESULT register_interfaces(struct regsvr_interface const *list); -static HRESULT unregister_interfaces(struct regsvr_interface const *list); - -struct regsvr_coclass -{ - CLSID const *clsid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - LPCSTR ips; /* can be NULL to omit */ - LPCSTR ips32; /* can be NULL to omit */ - LPCSTR ips32_tmodel; /* can be NULL to omit */ - LPCSTR clsid_str; /* can be NULL to omit */ - LPCSTR progid; /* can be NULL to omit */ -}; - -static HRESULT register_coclasses(struct regsvr_coclass const *list); -static HRESULT unregister_coclasses(struct regsvr_coclass const *list); - -/*********************************************************************** - * static string constants - */ -static WCHAR const interface_keyname[10] = { - 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; -static WCHAR const base_ifa_keyname[14] = { - 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', - 'e', 0 }; -static WCHAR const num_methods_keyname[11] = { - 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; -static WCHAR const ps_clsid_keyname[15] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', 0 }; -static WCHAR const ps_clsid32_keyname[17] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', '3', '2', 0 }; -static WCHAR const clsid_keyname[6] = { - 'C', 'L', 'S', 'I', 'D', 0 }; -static WCHAR const ips_keyname[13] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static WCHAR const ips32_keyname[15] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static WCHAR const progid_keyname[7] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static char const tmodel_valuename[] = "ThreadingModel"; - -/*********************************************************************** - * static helper functions - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); -static LONG register_key_defvalueW(HKEY base, WCHAR const *name, - WCHAR const *value); -static LONG register_key_defvalueA(HKEY base, WCHAR const *name, - char const *value); - -/*********************************************************************** - * register_interfaces - */ -static HRESULT register_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - HKEY iid_key; - - StringFromGUID2(list->iid, buf, 39); - res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_interface_key; - - if (list->name) { - res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->base_iid) { - res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (0 <= list->num_methods) { - static WCHAR const fmt[3] = { '%', 'd', 0 }; - HKEY key; - - res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - - sprintfW(buf, fmt, list->num_methods); - res = RegSetValueExW(key, NULL, 0, REG_SZ, - (CONST BYTE*)buf, - (lstrlenW(buf) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid) { - res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid32) { - res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - error_close_iid_key: - RegCloseKey(iid_key); - } - -error_close_interface_key: - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_interfaces - */ -static HRESULT unregister_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, - KEY_READ | KEY_WRITE, &interface_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->iid, buf, 39); - res = RegDeleteTreeW(interface_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - } - - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * register_coclasses - */ -static HRESULT register_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - HKEY clsid_key; - - StringFromGUID2(list->clsid, buf, 39); - res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->name) { - res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips) { - res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips32) { - HKEY ips32_key; - - res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &ips32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->ips32, - lstrlenA(list->ips32) + 1); - if (res == ERROR_SUCCESS && list->ips32_tmodel) - res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, - (CONST BYTE*)list->ips32_tmodel, - strlen(list->ips32_tmodel) + 1); - RegCloseKey(ips32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->clsid_str) { - res = register_key_defvalueA(clsid_key, clsid_keyname, - list->clsid_str); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->progid) { - HKEY progid_key; - - res = register_key_defvalueA(clsid_key, progid_keyname, - list->progid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegCreateKeyExA(HKEY_CLASSES_ROOT, list->progid, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &progid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_key_defvalueW(progid_key, clsid_keyname, buf); - RegCloseKey(progid_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - error_close_clsid_key: - RegCloseKey(clsid_key); - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_coclasses - */ -static HRESULT unregister_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, - KEY_READ | KEY_WRITE, &coclass_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->clsid, buf, 39); - res = RegDeleteTreeW(coclass_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->progid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * regsvr_key_guid - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) -{ - WCHAR buf[39]; - - StringFromGUID2(guid, buf, 39); - return register_key_defvalueW(base, name, buf); -} - -/*********************************************************************** - * regsvr_key_defvalueW - */ -static LONG register_key_defvalueW( - HKEY base, - WCHAR const *name, - WCHAR const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - (lstrlenW(value) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_key_defvalueA - */ -static LONG register_key_defvalueA( - HKEY base, - WCHAR const *name, - char const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - lstrlenA(value) + 1); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * coclass list - */ -static struct regsvr_coclass const coclass_list[] = { - { &CLSID_Sti, - "StillImage", - NULL, - "sti.dll", - "Both" - }, - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * interface list - */ -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 (STI.@) - */ -HRESULT WINAPI DllRegisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = STI_DllRegisterServer(); - if (SUCCEEDED(hr)) - hr = register_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = register_interfaces(interface_list); - return hr; -} - -/*********************************************************************** - * DllUnregisterServer (STI.@) - */ -HRESULT WINAPI DllUnregisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = unregister_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = unregister_interfaces(interface_list); - if (SUCCEEDED(hr)) - hr = STI_DllUnregisterServer(); - return hr; -} diff --git a/reactos/dll/win32/sti/sti.c b/reactos/dll/win32/sti/sti.c index 974bd06f693..de5f4262b0e 100644 --- a/reactos/dll/win32/sti/sti.c +++ b/reactos/dll/win32/sti/sti.c @@ -28,8 +28,6 @@ #include "objbase.h" #include "sti.h" -#include "sti_private.h" - #include "wine/debug.h" #include "wine/unicode.h" @@ -44,33 +42,41 @@ static const WCHAR registeredAppsLaunchPath[] = { 'R','e','g','i','s','t','e','r','e','d',' ','A','p','p','l','i','c','a','t','i','o','n','s',0 }; -static inline stillimage *impl_from_StillImageW(IStillImageW *iface) +typedef struct _stillimage { - return (stillimage *)((char*)iface - FIELD_OFFSET(stillimage, lpVtbl)); + IStillImageW IStillImageW_iface; + IUnknown IUnknown_iface; + IUnknown *pUnkOuter; + LONG ref; +} stillimage; + +static inline stillimage *impl_from_IStillImageW(IStillImageW *iface) +{ + return CONTAINING_RECORD(iface, stillimage, IStillImageW_iface); } static HRESULT WINAPI stillimagew_QueryInterface(IStillImageW *iface, REFIID riid, void **ppvObject) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); TRACE("(%p %s %p)\n", This, debugstr_guid(riid), ppvObject); return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject); } static ULONG WINAPI stillimagew_AddRef(IStillImageW *iface) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); return IUnknown_AddRef(This->pUnkOuter); } static ULONG WINAPI stillimagew_Release(IStillImageW *iface) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); return IUnknown_Release(This->pUnkOuter); } static HRESULT WINAPI stillimagew_Initialize(IStillImageW *iface, HINSTANCE hinst, DWORD dwVersion) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); TRACE("(%p, %p, 0x%X)\n", This, hinst, dwVersion); return S_OK; } @@ -78,7 +84,7 @@ static HRESULT WINAPI stillimagew_Initialize(IStillImageW *iface, HINSTANCE hins static HRESULT WINAPI stillimagew_GetDeviceList(IStillImageW *iface, DWORD dwType, DWORD dwFlags, DWORD *pdwItemsReturned, LPVOID *ppBuffer) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %u, 0x%X, %p, %p): stub\n", This, dwType, dwFlags, pdwItemsReturned, ppBuffer); return E_NOTIMPL; } @@ -86,7 +92,7 @@ static HRESULT WINAPI stillimagew_GetDeviceList(IStillImageW *iface, DWORD dwTyp static HRESULT WINAPI stillimagew_GetDeviceInfo(IStillImageW *iface, LPWSTR pwszDeviceName, LPVOID *ppBuffer) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), ppBuffer); return E_NOTIMPL; } @@ -94,7 +100,7 @@ static HRESULT WINAPI stillimagew_GetDeviceInfo(IStillImageW *iface, LPWSTR pwsz static HRESULT WINAPI stillimagew_CreateDevice(IStillImageW *iface, LPWSTR pwszDeviceName, DWORD dwMode, PSTIDEVICEW *pDevice, LPUNKNOWN pUnkOuter) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %s, %u, %p, %p): stub\n", This, debugstr_w(pwszDeviceName), dwMode, pDevice, pUnkOuter); return E_NOTIMPL; } @@ -102,7 +108,7 @@ static HRESULT WINAPI stillimagew_CreateDevice(IStillImageW *iface, LPWSTR pwszD static HRESULT WINAPI stillimagew_GetDeviceValue(IStillImageW *iface, LPWSTR pwszDeviceName, LPWSTR pValueName, LPDWORD pType, LPBYTE pData, LPDWORD cbData) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %s, %s, %p, %p, %p): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pValueName), pType, pData, cbData); return E_NOTIMPL; @@ -111,7 +117,7 @@ static HRESULT WINAPI stillimagew_GetDeviceValue(IStillImageW *iface, LPWSTR pws static HRESULT WINAPI stillimagew_SetDeviceValue(IStillImageW *iface, LPWSTR pwszDeviceName, LPWSTR pValueName, DWORD type, LPBYTE pData, DWORD cbData) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %s, %s, %u, %p, %u): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pValueName), type, pData, cbData); return E_NOTIMPL; @@ -120,7 +126,7 @@ static HRESULT WINAPI stillimagew_SetDeviceValue(IStillImageW *iface, LPWSTR pws static HRESULT WINAPI stillimagew_GetSTILaunchInformation(IStillImageW *iface, LPWSTR pwszDeviceName, DWORD *pdwEventCode, LPWSTR pwszEventName) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %p, %p, %p): stub\n", This, pwszDeviceName, pdwEventCode, pwszEventName); return E_NOTIMPL; @@ -136,7 +142,7 @@ static HRESULT WINAPI stillimagew_RegisterLaunchApplication(IStillImageW *iface, HKEY registeredAppsKey = NULL; DWORD ret; HRESULT hr = S_OK; - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); TRACE("(%p, %s, %s)\n", This, debugstr_w(pwszAppName), debugstr_w(pwszCommandLine)); @@ -165,7 +171,7 @@ static HRESULT WINAPI stillimagew_RegisterLaunchApplication(IStillImageW *iface, static HRESULT WINAPI stillimagew_UnregisterLaunchApplication(IStillImageW *iface, LPWSTR pwszAppName) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); HKEY registeredAppsKey = NULL; DWORD ret; HRESULT hr = S_OK; @@ -188,7 +194,7 @@ static HRESULT WINAPI stillimagew_UnregisterLaunchApplication(IStillImageW *ifac static HRESULT WINAPI stillimagew_EnableHwNotifications(IStillImageW *iface, LPCWSTR pwszDeviceName, BOOL bNewState) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %s, %u): stub\n", This, debugstr_w(pwszDeviceName), bNewState); return E_NOTIMPL; } @@ -196,14 +202,14 @@ static HRESULT WINAPI stillimagew_EnableHwNotifications(IStillImageW *iface, LPC static HRESULT WINAPI stillimagew_GetHwNotificationState(IStillImageW *iface, LPCWSTR pwszDeviceName, BOOL *pbCurrentState) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), pbCurrentState); return E_NOTIMPL; } static HRESULT WINAPI stillimagew_RefreshDeviceBus(IStillImageW *iface, LPCWSTR pwszDeviceName) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %s): stub\n", This, debugstr_w(pwszDeviceName)); return E_NOTIMPL; } @@ -211,7 +217,7 @@ static HRESULT WINAPI stillimagew_RefreshDeviceBus(IStillImageW *iface, LPCWSTR static HRESULT WINAPI stillimagew_LaunchApplicationForDevice(IStillImageW *iface, LPWSTR pwszDeviceName, LPWSTR pwszAppName, LPSTINOTIFY pStiNotify) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %s, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pwszAppName), pStiNotify); return E_NOTIMPL; @@ -219,14 +225,14 @@ static HRESULT WINAPI stillimagew_LaunchApplicationForDevice(IStillImageW *iface static HRESULT WINAPI stillimagew_SetupDeviceParameters(IStillImageW *iface, PSTI_DEVICE_INFORMATIONW pDevInfo) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %p): stub\n", This, pDevInfo); return E_NOTIMPL; } static HRESULT WINAPI stillimagew_WriteToErrorLog(IStillImageW *iface, DWORD dwMessageType, LPCWSTR pszMessage) { - stillimage *This = impl_from_StillImageW(iface); + stillimage *This = impl_from_IStillImageW(iface); FIXME("(%p, %u, %s): stub\n", This, dwMessageType, debugstr_w(pszMessage)); return E_NOTIMPL; } @@ -253,21 +259,21 @@ static const struct IStillImageWVtbl stillimagew_vtbl = stillimagew_WriteToErrorLog }; -static inline stillimage *impl_from_InternalUnknown(IUnknown *iface) +static inline stillimage *impl_from_IUnknown(IUnknown *iface) { - return (stillimage *)((char*)iface - FIELD_OFFSET(stillimage, lpInternalUnkVtbl)); + return CONTAINING_RECORD(iface, stillimage, IUnknown_iface); } static HRESULT WINAPI Internal_QueryInterface(IUnknown *iface, REFIID riid, void **ppvObject) { - stillimage *This = impl_from_InternalUnknown(iface); + stillimage *This = impl_from_IUnknown(iface); TRACE("(%p %s %p)\n", This, debugstr_guid(riid), ppvObject); if (IsEqualGUID(riid, &IID_IUnknown)) *ppvObject = iface; else if (IsEqualGUID(riid, &IID_IStillImageW)) - *ppvObject = &This->lpVtbl; + *ppvObject = &This->IStillImageW_iface; else { if (IsEqualGUID(riid, &IID_IStillImageA)) @@ -284,14 +290,14 @@ static HRESULT WINAPI Internal_QueryInterface(IUnknown *iface, REFIID riid, void static ULONG WINAPI Internal_AddRef(IUnknown *iface) { - stillimage *This = impl_from_InternalUnknown(iface); + stillimage *This = impl_from_IUnknown(iface); return InterlockedIncrement(&This->ref); } static ULONG WINAPI Internal_Release(IUnknown *iface) { ULONG ref; - stillimage *This = impl_from_InternalUnknown(iface); + stillimage *This = impl_from_IUnknown(iface); ref = InterlockedDecrement(&This->ref); if (ref == 0) @@ -328,21 +334,21 @@ HRESULT WINAPI StiCreateInstanceW(HINSTANCE hinst, DWORD dwVer, PSTIW *ppSti, LP This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(stillimage)); if (This) { - This->lpVtbl = &stillimagew_vtbl; - This->lpInternalUnkVtbl = &internal_unk_vtbl; + This->IStillImageW_iface.lpVtbl = &stillimagew_vtbl; + This->IUnknown_iface.lpVtbl = &internal_unk_vtbl; if (pUnkOuter) This->pUnkOuter = pUnkOuter; else - This->pUnkOuter = (IUnknown*) &This->lpInternalUnkVtbl; + This->pUnkOuter = &This->IUnknown_iface; This->ref = 1; - hr = IStillImage_Initialize((IStillImageW*) &This->lpVtbl, hinst, dwVer); + hr = IStillImage_Initialize(&This->IStillImageW_iface, hinst, dwVer); if (SUCCEEDED(hr)) { if (pUnkOuter) - *ppSti = (IStillImageW*) &This->lpInternalUnkVtbl; + *ppSti = (IStillImageW*) &This->IUnknown_iface; else - *ppSti = (IStillImageW*) &This->lpVtbl; + *ppSti = &This->IStillImageW_iface; } } else diff --git a/reactos/dll/win32/sti/sti.rc b/reactos/dll/win32/sti/sti.rc new file mode 100644 index 00000000000..fa6929a3a60 --- /dev/null +++ b/reactos/dll/win32/sti/sti.rc @@ -0,0 +1 @@ +1 WINE_REGISTRY sti.rgs diff --git a/reactos/dll/win32/sti/sti.rgs b/reactos/dll/win32/sti/sti.rgs new file mode 100644 index 00000000000..dc2c32487cb --- /dev/null +++ b/reactos/dll/win32/sti/sti.rgs @@ -0,0 +1,37 @@ +HKCR +{ + NoRemove Interface + { + '{5EB2502A-8CF1-11D1-BF92-0060081ED811}' = s 'IWiaDevMgr' + { + NumMethods = s 12 + ProxyStubClsid32 = s '{4DB1AD10-3391-11D2-9A33-00C04FA36145}' + } + '{5E38B83C-8CF1-11D1-BF92-0060081ED811}' = s 'IEnumWIA_DEV_INFO' + { + NumMethods = s 3 + ProxyStubClsid32 = s '{4DB1AD10-3391-11D2-9A33-00C04FA36145}' + } + '{4DB1AD10-3391-11D2-9A33-00C04FA36145}' = s 'IWiaItem' + { + NumMethods = s 3 + ProxyStubClsid32 = s '{4DB1AD10-3391-11D2-9A33-00C04FA36145}' + } + '{AE6287B0-0084-11D2-973B-00A0C9068F2E}' = s 'IWiaEventCallback' + { + NumMethods = s 4 + ProxyStubClsid32 = s '{4DB1AD10-3391-11D2-9A33-00C04FA36145}' + } + } + NoRemove CLSID + { + '{4DB1AD10-3391-11D2-9A33-00C04FA36145}' = s 'PSFactoryBuffer' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{B323F8E0-2E68-11D0-90EA-00AA0060F86C}' = s 'StillImage' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + } +} diff --git a/reactos/dll/win32/sti/sti_main.c b/reactos/dll/win32/sti/sti_main.c index 711c17f14eb..c532ffbd6ac 100644 --- a/reactos/dll/win32/sti/sti_main.c +++ b/reactos/dll/win32/sti/sti_main.c @@ -26,6 +26,8 @@ #include "winreg.h" #include "winerror.h" #include "objbase.h" +#include "initguid.h" +#include "wia_lh.h" #include "sti.h" #include "wine/debug.h" @@ -34,18 +36,20 @@ 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; +extern HRESULT WINAPI STI_DllRegisterServer(void) DECLSPEC_HIDDEN; +extern HRESULT WINAPI STI_DllUnregisterServer(void) DECLSPEC_HIDDEN; typedef HRESULT (*fnCreateInstance)(REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj); typedef struct { - const struct IClassFactoryVtbl *vtbl; + IClassFactory IClassFactory_iface; fnCreateInstance pfnCreateInstance; } sti_cf; static inline sti_cf *impl_from_IClassFactory( IClassFactory *iface ) { - return (sti_cf *)((char *)iface - FIELD_OFFSET( sti_cf, vtbl )); + return CONTAINING_RECORD(iface, sti_cf, IClassFactory_iface); } static HRESULT sti_create( REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj ) @@ -127,7 +131,7 @@ static const struct IClassFactoryVtbl sti_cf_vtbl = sti_cf_LockServer }; -static sti_cf the_sti_cf = { &sti_cf_vtbl, sti_create }; +static sti_cf the_sti_cf = { { &sti_cf_vtbl }, sti_create }; BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) { @@ -149,7 +153,7 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) if (IsEqualGUID( rclsid, &CLSID_Sti )) { - cf = (IClassFactory *)&the_sti_cf.vtbl; + cf = &the_sti_cf.IClassFactory_iface; } if (cf) @@ -164,3 +168,19 @@ HRESULT WINAPI DllCanUnloadNow( void ) { return S_FALSE; } + +/*********************************************************************** + * DllRegisterServer (STI.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return STI_DllRegisterServer(); +} + +/*********************************************************************** + * DllUnRegisterServer (STI.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return STI_DllUnregisterServer(); +} diff --git a/reactos/dll/win32/sti/sti_wia.idl b/reactos/dll/win32/sti/sti_wia.idl index aaac943445f..64bd6acdc6c 100644 --- a/reactos/dll/win32/sti/sti_wia.idl +++ b/reactos/dll/win32/sti/sti_wia.idl @@ -17,3 +17,17 @@ */ #include "wia_lh.idl" + +#ifdef __WIDL__ +[ + threading(both), + uuid(4db1ad10-3391-11d2-9a33-00c04fa36145) /* IWiaItem */ +] +coclass PSFactoryBuffer { interface IFactoryBuffer; } + +[ + threading(both), + uuid(b323f8e0-2e68-11d0-90ea-00aa0060f86c) +] +coclass StillImage { interface IStillImageW; } +#endif diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index ad016f7d7a8..940b3acce03 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -160,7 +160,7 @@ reactos/dll/win32/softpub # Synced to Wine-1.3.37 reactos/dll/win32/spoolss # Synced to Wine-1.5.4 reactos/dll/win32/stdole2.tlb # Synced to Wine-1.3.37 reactos/dll/win32/stdole32.tlb # Synced to Wine-1.3.37 -reactos/dll/win32/sti # Autosync +reactos/dll/win32/sti # Synced to Wine-1.5.4 reactos/dll/win32/sxs # Synced to Wine-1.3.37 reactos/dll/win32/tapi32 # Autosync reactos/dll/win32/traffic # Autosync