59 0, 0, { (
DWORD_PTR)(__FILE__
": apt_cs") }
70 0, 0, { (
DWORD_PTR)(__FILE__
": dlls_cs") }
300 hr = IUnknown_QueryInterface(unk,
riid,
obj);
301 IUnknown_Release(unk);
336 MSHCTX_LOCAL,
NULL, MSHLFLAGS_TABLESTRONG);
338 IStream_Release(
obj->marshal_stream);
351 hr = IStream_Clone(
apt->local_server->marshal_stream,
ret);
356 ERR(
"Failed: %#lx\n",
hr);
366 TRACE(
"creating new apartment, model %ld\n", model);
368 apt =
calloc(1,
sizeof(*apt));
410 if (
entry->dll->DllCanUnloadNow && (
entry->dll->DllCanUnloadNow() ==
S_OK))
412 DWORD real_delay = delay;
420 if (
entry->multi_threaded)
421 real_delay = 10 * 60 * 1000;
435 if (!
entry->unload_time)
entry->unload_time = 1;
438 else if (
entry->unload_time)
439 entry->unload_time = 0;
519 if (
apt->filter) IMessageFilter_Release(
apt->filter);
642 if (apt->oxid ==
oxid)
664 if (apt !=
mta && apt->tid ==
tid)
730 const WCHAR *quote_start;
734 const WCHAR *quote_end =
wcschr(quote_start + 1,
'\"');
737 memmove(
src, quote_start + 1, (quote_end - quote_start - 1) *
sizeof(
WCHAR));
738 src[quote_end - quote_start - 1] =
'\0';
761 BOOL apartment_threaded,
776 TRACE(
"calling ole32!DllGetClassObject\n");
777 hr = p_ole32_DllGetClassObject(rclsid,
riid,
ppv);
821 if (!apartment_threaded)
904 DWORD apartment_tid = 0;
907 if (!multi_threaded && main_apartment)
949 if (multi_threaded || !main_apartment)
970 params.regdata = *regdata;
994 ERR(
"host apartment didn't create window\n");
1002 IStream_Release(
params.stream);
1010 WCHAR threading_model[10 ];
1017 threading_model[0] =
'\0';
1028 return data->u.actctx.threading_model;
1035 BOOL apartment_threaded;
1037 if (!(class_context & CLSCTX_PS_DLL))
1043 apartment_threaded =
TRUE;
1049 apartment_threaded =
FALSE;
1056 apartment_threaded =
TRUE;
1059 FIXME(
"unrecognised threading model %d for object %s, should be main-threaded?\n", model,
debugstr_guid(rclsid));
1065 apartment_threaded =
FALSE;
1102 IUnknown_Release(
object);
1140 WARN(
"Attempt to change threading model of this apartment from %s to %s\n",
1141 data->apt->multi_threaded ?
"multi-threaded" :
"apartment threaded",
1157 if (
data->ole_inits)
1158 WARN(
"Uninitializing apartment while Ole is still initialized\n" );
1160 if (
data->implicit_mta_cookie)
1240 memset(&wclass, 0,
sizeof(wclass));
1263 hwnd =
CreateWindowW(
aptwinclassW,
NULL, 0, 0, 0, 0, 0,
HWND_MESSAGE, 0,
hProxyDll,
NULL);
1305 if ((
apt =
data->apt) && (
data->implicit_mta_cookie ||
apt->multi_threaded))
1317 ERR(
"Failed, hr %#lx.\n",
hr);
#define CO_E_NOTINITIALIZED
static BOOL get_object_dll_path(const struct class_reg_data *regdata, WCHAR *dst, DWORD dstlen)
static void apartment_release_dlls(void)
HRESULT(WINAPI * DllCanUnloadNowFunc)(void)
static struct apartment * apartment_get_or_create(DWORD model)
static CRITICAL_SECTION_DEBUG dlls_cs_debug
HRESULT apartment_createwindowifneeded(struct apartment *apt)
static struct apartment * mta
static ATOM apt_win_class
static HRESULT apartment_getclassobject(struct apartment *apt, LPCWSTR dllpath, BOOL apartment_threaded, REFCLSID rclsid, REFIID riid, void **ppv)
static LRESULT CALLBACK apartment_wndproc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
HRESULT apartment_get_inproc_class_object(struct apartment *apt, const struct class_reg_data *regdata, REFCLSID rclsid, REFIID riid, DWORD class_context, void **ppv)
void apartment_global_cleanup(void)
static CRITICAL_SECTION_DEBUG apt_cs_debug
struct apartment * apartment_get_mta(void)
HRESULT enter_apartment(struct tlsdata *data, DWORD model)
static BOOL apartment_is_model(const struct apartment *apt, DWORD model)
static DWORD apartment_addref(struct apartment *apt)
static const IServiceProviderVtbl local_server_vtbl
HRESULT apartment_increment_mta_usage(CO_MTA_USAGE_COOKIE *cookie)
static struct apartment * apartment_findmain(void)
HRESULT apartment_get_local_server_stream(struct apartment *apt, IStream **ret)
void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay)
static HRESULT WINAPI local_server_QueryInterface(IServiceProvider *iface, REFIID riid, void **obj)
static const WCHAR aptwinclassW[]
static CRITICAL_SECTION dlls_cs
void leave_apartment(struct tlsdata *data)
void apartment_release(struct apartment *apt)
static CRITICAL_SECTION apt_cs
void apartment_decrement_mta_usage(CO_MTA_USAGE_COOKIE cookie)
HRESULT(WINAPI * DllGetClassObjectFunc)(REFCLSID clsid, REFIID iid, void **obj)
static HRESULT WINAPI local_server_QueryService(IServiceProvider *iface, REFGUID guid, REFIID riid, void **obj)
HWND apartment_getwindow(const struct apartment *apt)
static struct apartment * main_sta
static HRESULT apartment_hostobject(struct apartment *apt, const struct host_object_params *params)
OXID apartment_getoxid(const struct apartment *apt)
struct apartment * apartment_findfromtid(DWORD tid)
static ULONG WINAPI local_server_Release(IServiceProvider *iface)
static DWORD CALLBACK apartment_hostobject_thread(void *p)
struct apartment * apartment_findfromoxid(OXID oxid)
static struct apartment * apartment_construct(DWORD model)
struct apartment * apartment_get_current_or_mta(void)
static HRESULT apartment_add_dll(const WCHAR *library_name, struct opendll **ret)
static ULONG WINAPI local_server_AddRef(IServiceProvider *iface)
static void apartment_release_dll(struct opendll *entry, BOOL free_entry)
@ ThreadingModel_Apartment
static struct local_server * impl_from_IServiceProvider(IServiceProvider *iface)
static enum comclass_threadingmodel get_threading_model(const struct class_reg_data *data)
static struct opendll * apartment_get_dll(const WCHAR *library_name)
static HRESULT apartment_hostobject_in_hostapt(struct apartment *apt, BOOL multi_threaded, BOOL main_apartment, const struct class_reg_data *regdata, REFCLSID rclsid, REFIID riid, void **ppv)
#define InterlockedIncrement
#define InterlockedDecrement
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static void list_remove(struct list_entry *entry)
static int list_empty(struct list_entry *head)
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
static void list_add_head(struct list_entry *head, struct list_entry *entry)
static void list_init(struct list_entry *head)
void rpc_execute_call(struct dispatch_params *params)
HRESULT apartment_disconnectproxies(struct apartment *apt)
@ OLETLS_APARTMENTTHREADED
ULONG stub_manager_int_release(struct stub_manager *stub_manager)
static struct apartment * com_get_current_apt(void)
static HRESULT com_get_tlsdata(struct tlsdata **data)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
IUnknown * com_get_registered_class_object(const struct apartment *apt, REFCLSID rclsid, DWORD clscontext)
void apartment_revoke_all_classes(const struct apartment *apt)
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(void *reserved, DWORD model)
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL delete_on_release, IStream **stream)
HRESULT WINAPI CoMarshalInterface(IStream *stream, REFIID riid, IUnknown *unk, DWORD dest_context, void *pvDestContext, DWORD mshlFlags)
HRESULT WINAPI CoReleaseMarshalData(IStream *stream)
HRESULT WINAPI CoUnmarshalInterface(IStream *stream, REFIID riid, void **ppv)
#define GetProcAddress(x, y)
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
static DWORD DWORD * dwLength
BOOL WINAPI DeactivateActCtx(IN DWORD dwFlags, IN ULONG_PTR ulCookie)
BOOL WINAPI ActivateActCtx(IN HANDLE hActCtx, OUT PULONG_PTR ulCookie)
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
DWORD WINAPI SearchPathW(IN LPCWSTR lpPath OPTIONAL, IN LPCWSTR lpFileName, IN LPCWSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart OPTIONAL)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
BOOL WINAPI InitOnceExecuteOnce(_Inout_ PINIT_ONCE InitOnce, _In_ __callback PINIT_ONCE_FN InitFn, _Inout_opt_ PVOID Parameter, _Outptr_opt_result_maybenull_ LPVOID *Context)
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
ULONG WINAPI DECLSPEC_HOTPATCH GetTickCount(void)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum const GLfloat * params
#define InterlockedCompareExchangePointer
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
static ATOM register_class(void)
static const LARGE_INTEGER llZero
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *ppvOut)
HRESULT WINAPI DllCanUnloadNow(void)
@ COINIT_APARTMENTTHREADED
#define IsEqualGUID(rguid1, rguid2)
static unsigned __int64 next
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
#define LIST_FOR_EACH_SAFE(cursor, cursor2, list)
LIST_ENTRY ProcessLocksList
PRTL_CRITICAL_SECTION_DEBUG DebugInfo
struct local_server * local_server
struct list usage_cookies
union class_reg_data::@323 u
enum class_reg_data_origin origin
struct class_reg_data::@323::@324 actctx
struct class_reg_data regdata
IServiceProvider IServiceProvider_iface
DllGetClassObjectFunc DllGetClassObject
DllCanUnloadNowFunc DllCanUnloadNow
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
TW_UINT32 TW_UINT16 TW_UINT16 MSG
#define CONTAINING_RECORD(address, type, field)
static EFI_HANDLE * handles
DWORD WINAPI GetLastError(void)
DWORD WINAPI GetCurrentThreadId(void)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
DWORD WINAPI GetCurrentProcessId(void)
#define LOAD_WITH_ALTERED_SEARCH_PATH
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define INIT_ONCE_STATIC_INIT
#define REGDB_E_CLASSNOTREG
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
#define RPC_E_CHANGED_MODE
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
BOOL WINAPI TranslateMessage(_In_ const MSG *)
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
ATOM WINAPI RegisterClassW(_In_ CONST WNDCLASSW *)
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
BOOL WINAPI PostThreadMessageW(_In_ DWORD, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
BOOL WINAPI UnregisterClassW(_In_ LPCWSTR, HINSTANCE)
BOOL WINAPI DestroyWindow(_In_ HWND)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)