Cómo: Inicializar RAPI asincrónicamente con CeRapiInitEx()

Seleccione idioma Seleccione idioma
Id. de artículo: 831883 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Aplicaciones de escritorio llama a la función de CeRapiInitEx para inicializar la API remota (RAPI) antes de que las aplicaciones realizan las llamadas RAPI a comunicarse con los dispositivos Pocket PC o Microsoft Smartphone. CeRapiInitEx se puede llamar asincrónicamente pasando un puntero válido a la estructura RAPIINIT y el llamador puede determinar cuánto desea esperar a RAPI se inicializa, mediante la función WaitForSingleObject .

En Microsoft ActiveSync 3.7 y en versiones anteriores, RAPI se diseñó para inicializarse en subprocesos con surtidores de mensajes. RAPI no se ha diseñado para ser inicializado asychronously en subprocesos en aplicaciones cliente. Microsoft no recomienda que utilice soluciones provisionales no oficiales para realizar RAPI inicializar asychronously en subprocesos en aplicaciones cliente.


El modelo de subproceso RAPI se cambió en ActiveSync 3.7.1 para que se puede libremente inicializarse en ambos subprocesos de bombeo de mensaje (IU) o en subprocesos de trabajo simple. Por lo tanto, si utiliza CeRapiInitEx correctamente, no es necesaria ninguna solución y se podrá inicializar RAPI en cualquier contexto. Como efecto secundario, no oficiales soluciones no funcionará. Este artículo incluye ejemplos de cómo utilizar correctamente CeRapiInitEx para inicializar RAPI asincrónicamente.

Nota Para inicializar RAPI sincrónicamente, realizar una llamada de bloqueo mediante la función CeRapiInit . El cambio de comportamiento en ActiveSync 3.7.1 no afecta a las aplicaciones que llamen CeRapiInit inicializar RAPI sincrónicamente.

Más información

Ejemplo de código de solución incorrecta

Este código de ejemplo se muestra cómo una solución típica no oficial que funcionaban en ActiveSync 3.7 o anterior. Es una solución ineficaz porque llama a las funciones CeRapiInitEx y CeRapiUninit muchas veces. Este código no funciona en ActiveSync 3.7.1 o posterior porque el subproceso modelo dentro de la RAPI se cambió.
RAPIINIT ri; 			
BOOL    bCancel;
DWORD   dwWait;

while (!bCancel)
{
	// This is incorrect because it repeatedly calls CeRapiInitEx. 
	CeRapiInitEx(&ri);		
	
	// This is incorrect because in ActiveSync 3.7.1, the event may not be signaled before CeRapiInitEx
	//returns if a device is already connected.
	dwWait = WaitForSingleObject(ri.heRapiInit, 0);
		
	if (dwWait == WAIT_OBJECT_0)
	{
		// Succeeded.
		goto Succeeded;
	}
	else if (dwWait == WAIT_TIMEOUT)
	{
		 // This is incorrect because it repeatedly calls CeRapiUninit.
		CeRapiUninit(); 
		Continue;
	}
	else
	{
		// Failed.
		CeRapiUninit();
		goto failed;
	}
}

Ejemplos

Los siguientes ejemplos de código Demuestre cómo inicializar RAPI asincrónicamente. Estos ejemplos no son el único método de inicialización de forma asincrónica RAPI, pero muestran el principio general: llamada CeRapiInitEx una vez, a continuación, espere a que el evento RAPI para inicializar según sus requisitos. Puede utilizar un valor de tiempo de espera, un temporizador o otros mecanismos de evento para esperar a finalizar la inicialización.

Nota Los ejemplos se basan en ActiveSync 3.7.1. Si desea asegurarse de que su aplicación funciona correctamente con ActiveSync 3.7.1 y la versión anterior de ActiveSync, debe inicializar RAPI en un subproceso con un suministro de mensajes. Para obtener más información, vea Ejemplo 2.

ejemplo 1

Para inicializar RAPI asincrónicamente en un subproceso de trabajo simple, utilice el siguiente código. En el código, se llama a la función CeRapiUninit para desinicializar RAPI si la función WaitForSingleObject devuelve un valor que no sea WAIT_OBJECT_0 . Este comportamiento probablemente está causado por un evento de tiempo de espera (en este ejemplo, el tiempo de espera es 30 segundos).
#define ONE_SECOND 1000
            
RAPIINIT ri = {sizeof(RAPIINIT), 0, 0};

HRESULT hr = E_FAIL;
DWORD   dwWaitRet = 0;
DWORD   dwTimeout = 30  * ONE_SECOND; // Wait for 30 seconds. You can specify a different value here.

// Call CeRapiInitEx one time.
hr = CeRapiInitEx(&ri);
	
if (FAILED(hr))
{
	goto failed;
}

// Wait for the RAPI event until timeout.
	
// Use the WaitForSingleObject function for the worker thread.
// Use the WaitForMultipleObjects function if you are also waiting for other events.
dwWaitRet = WaitForSingleObject(ri.heRapiInit, dwTimeout);

if (dwWaitRet == WAIT_OBJECT_0)
{
	// If the RAPI init is returned, check the result.
	if (SUCCEEDED(ri.hrRapiInit))
	{
		// Succeeded.
		goto succeeded;
	}
	else
	{
		goto failed;
	}	
}
else 
{
	// Timeout or failed.
	goto failed;
}

succeeded:
	// Now you can make RAPI calls.

failed:
	// Uninitialize RAPI if you ever called CeRapiInitEx.
	if (SUCCEEDED(hr))
	{
		CeRapiUninit();
	}
ejemplo 2

Para inicializar RAPI asincrónicamente en un subproceso de interfaz de usuario (un subproceso con un suministro de mensajes), anular al tiempo de espera


Para inicializar RAPI asincrónicamente en un subproceso de interfaz de usuario, utilice el siguiente código. En el código, se llama a la función CeRapiUninit para desinicializar RAPI si la función MsgWaitForMultipleObjects devuelve un valor que no sea WAIT_OBJECT_0 . Este comportamiento probablemente está causado por un tiempo de espera (en este ejemplo, el tiempo de espera es 30 segundos) o si cualquier mensaje está en la cola.
#define ONE_SECOND 1000
            
RAPIINIT ri = {sizeof(RAPIINIT), 0, 0};

HRESULT 	hr = E_FAIL;
DWORD   	dwWaitRet = 0;
DWORD   	dwTimeout = 30 * ONE_SECOND; // Wait for 30 seconds, or specify your own value here.
DWORD		dwEndTime;
DWORD		dwCurrentTime;

// Call CeRapiInitEx one time.
ri.cbSize = sizeof(ri);
hr = CeRapiInitEx(&ri);
	
if (FAILED(hr))
{
	goto failed;
}
	
// Calculate the time that you want to wait until.
dwCurrentTime  = GetTickCount();
dwEndTime = dwCurrentTime  + dwTimeout;

// Now wait for the RAPI event until timeout.
while (dwEndTime > dwCurrentTime)
{
	//
	// Wait for the RAPI event until timeout.  Use the MsgWaitForMultipleObjects function for the 
 // UI thread because otherwise the thread will be blocked for message processing.
	//
	dwWaitRet = MsgWaitForMultipleObjects(1, &ri.heRapiInit, FALSE, dwEndTime - dwCurrentTime,QS_ALLINPUT);

	if (dwWaitRet == WAIT_OBJECT_0)
	{
		// RAPI init returned, check result
		if (SUCCEEDED(ri.hrRapiInit))
		{
			// Succeeded.
			goto succeeded;
		}
		else
		{
			goto failed;
		}

	}
	else if (dwWaitRet == WAIT_OBJECT_0 + 1)
	{
		// Process the messages.
		BOOL bQuit = FALSE;
		MSG msg;
		while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			bQuit = (msg.message == WM_QUIT);
			TranslateMessage(&msg);	
			DispatchMessage(&msg);
		}
		if (bQuit)
		{
			goto failed;
		} 

		// Update the timer.
		dwCurrentTime  = GetTickCount();
			
		// Loop back, and thencontinue to wait.
		continue;
	}
	else
	{
		// Timed out or failed.
		goto failed;
	}
}

succeeded:
	// Now you can make RAPI calls.

failed:
	// Uninitialize RAPI if CeRapiInitEx was called.
	if (SUCCEEDED(hr))
	{
		CeRapiUninit();
	}

Referencias

Para obtener más información acerca de ActiveSync y RAPI, visite los siguientes sitios Web de Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms879784.aspx

http://msdn2.microsoft.com/en-us/library/ms860198.aspx

Propiedades

Id. de artículo: 831883 - Última revisión: jueves, 29 de noviembre de 2007 - Versión: 1.5
La información de este artículo se refiere a:
  • Microsoft ActiveSync 4.1
  • Software Microsoft Windows CE Palm-size PC 2.01
  • Microsoft Pocket PC 2002 Software Standard Edition
Palabras clave: 
kbmt kbhowtomaster KB831883 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 831883

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com