int SyncCallProxy(PSYNCCALLBACKPROC pfnProc, WPARAM wParam, LPARAM lParam, CRITICAL_SECTION * cs /* = NULL */) { SYNCCALLITEM item={0}; int nReturn = 0; if ( cs != NULL ) { if ( !fnTryEnterCriticalSection ) // for poor OSes like Win98 { EnterCriticalSection( cs ); int result = pfnProc( wParam, lParam ); LeaveCriticalSection( cs ); return result; } if ( fnTryEnterCriticalSection( cs )) { //simple call (Fastest) int result=pfnProc(wParam,lParam); LeaveCriticalSection( cs ); return result; } else { //Window SendMessage Call(Middle) if ( SyncCallWinProcProxy( pfnProc, wParam, lParam, nReturn ) == S_OK) return nReturn; } } if ( SyncCallAPCProxy( pfnProc, wParam, lParam, nReturn ) == S_OK) return nReturn; return NULL; }
int SyncCall(void * vproc, int count, ...) { LPARAM params[5]; va_list va; int i; params[0] = (LPARAM)count; va_start(va, count); for (i = 0; i < count && i < _countof(params) - 1; i++) params[i + 1] = va_arg(va, LPARAM); va_end(va); return SyncCallAPCProxy(SyncCaller, (WPARAM)vproc, (LPARAM)params); }
int DoCall(PSYNCCALLBACKPROC pfnProc, WPARAM, LPARAM lParam) { return SyncCallAPCProxy(pfnProc, 0, lParam); }