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;
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
int DoCall(PSYNCCALLBACKPROC pfnProc, WPARAM, LPARAM lParam)
{
	return SyncCallAPCProxy(pfnProc, 0, lParam);
}