Mobile Breitband-API – Bewährte Methoden
Bei der Arbeit mit der Mobile Broadband-API sollten die folgenden bewährten Methoden verwendet werden, um die bestmögliche Leistung zu erzielen.
Funktionale Objekte nicht zwischenspeichern
Funktionale Objekte, z. B. IMbnInterface und andere, werden mithilfe der -Enumerationsmethode für das entsprechende Managerobjekt von Managerobjekten wie IMbnInterfaceManagerabgerufen. Speichern Sie diese funktionalen Objekte nicht zwischen, da zwischengespeicherte funktionale Objekte veraltete Daten enthalten. Die synchronen Vorgänge, die für diese funktionalen Objekte ausgeführt werden, geben dieselben Daten zurück, bis die funktionalen Objekte erneut erhalten werden.
Speichern Sie stattdessen die Manager-Objekte zwischen, und beziehen Sie die funktionalen Objekte mithilfe der -Enumerationsmethode für das entsprechende Manager-Objekt erneut aus dem Manager-Objekt, um die neuesten Daten zu erhalten.
Im folgenden Codebeispiel wird die richtige Methode zum Zwischenspeichern von Manager-Objekten veranschaulicht.
#include <atlbase.h>
#include "mbnapi.h"
#include <tchar.h>
int main()
{
HRESULT hr = E_FAIL;
int returnVal = 0;
do
{
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(hr))
{
returnVal = hr;
break;
}
CComPtr<IMbnInterfaceManager> g_InterfaceMgr = NULL;
//Do the below once(cache the manager objects)
hr = CoCreateInstance(CLSID_MbnInterfaceManager,
NULL,
CLSCTX_ALL,
IID_IMbnInterfaceManager,
(void**)&g_InterfaceMgr);
if (FAILED(hr))
{
returnVal = hr;
break;
}
SAFEARRAY *psa = NULL;
//Do the below each time(do not cache functional objects)
hr = g_InterfaceMgr->GetInterfaces(&psa);
if (FAILED(hr))
{
returnVal = hr;
break;
}
LONG lLower;
LONG lUpper;
hr = SafeArrayGetLBound(psa, 1, &lLower);
if (FAILED(hr))
{
returnVal = hr;
break;
}
hr = SafeArrayGetUBound(psa, 1, &lUpper);
if (FAILED(hr))
{
returnVal = hr;
break;
}
CComPtr<IMbnInterface> pInf = NULL;
MBN_READY_STATE readyState;
for (LONG l = lLower; l <= lUpper; l++)
{
hr = SafeArrayGetElement(psa, &l, (void*)(&pInf));
if (FAILED(hr))
{
returnVal = hr;
break;
}
hr = pInf->GetReadyState(&readyState);
if (FAILED(hr))
{
returnVal = hr;
break;
}
_tprintf(_T("Ready State = %d"), readyState);
}
if (FAILED(hr))
{
break;
}
} while (FALSE);
CoUninitialize();
return returnVal;
}
Behandeln aller Benachrichtigungen
Befolgen und verarbeiten Sie alle Benachrichtigungen, auch wenn sie nicht von Ihrer Anwendung ausgelöst werden. Dies ist erforderlich, um die Benutzeroberfläche mit dem tatsächlichen Zustand des Geräts synchron zu halten.
Auf einem Computer können mehrere Verbindungs-Manager ausgeführt werden. Die native, von Windows 7 bereitgestellte Benutzeroberfläche für verfügbare Netzwerkschnittstellen anzeigen ist ein Verbindungs-Manager. Alle anderen Verbindungs-Manager müssen auf alle Benachrichtigungen reagieren, um die systemeigene Benutzeroberfläche Windows synchronisieren zu können. Ein Benutzer kann einen Vorgang für einen der Verbindungs-Manager durchführen, was zu einer Zustandsänderung des mobilen Breitbandgeräts führen kann. Andere Verbindungs-Manager müssen jedoch aktualisiert bleiben, um den geänderten Zustand des Geräts ordnungsgemäß anzugeben.
Wenn Sie beispielsweise eine Verbindung mit einem der Verbindungs-Manager herstellen, ändert sich der Zustand des Geräts von verfügbar in verbunden. Diese Änderung sollte für die Verbindungs-Manager sichtbar sein, die diese Aktion nicht initiiert haben. Alle Verbindungs-Manager, die über eine Benutzeroberfläche verfügen, die den Verbindungsstatus des Geräts angibt, müssen die Verbindungsstatusbenachrichtigungen abhören und verarbeiten, um ihre Benutzeroberfläche ordnungsgemäß zu aktualisieren.
Senden und Empfangen von Bytes
Verwenden Sie die IP-Hilfsfunktionen GetlfEntry und GetlfEntry2, um Bytes zu senden und zu empfangen.
Verwenden der API zum Entsperren von Pins
Eine aufrufende Clientanwendung muss erhöht werden, damit IMbnPin::Unblock erfolgreich aufgerufen werden kann. Diese Methode ist der einzige Teil der mobile Breitband-API, der Administrator- oder NCO-Berechtigungen erfordert.
Arbeiten mit SafeArrays
Verwenden Sie ZeroMemory(), bevor Sie auf Elemente in einem SafeArray zugreifen.
Überprüfen Sie nicht die Indizes eines SafeArray. Sie können negativ sein.
Im folgenden Codebeispiel wird die ordnungsgemäße Handhabung eines SafeArray veranschaulicht.
#include <atlbase.h>
#include "mbnapi.h"
void CreateVisibleProviderList(LPCWSTR interfaceID)
{
CComPtr<IMbnInterfaceManager> g_InterfaceMgr = NULL;
SAFEARRAY *visibleProviders = NULL;
long visibleLower = 0;
long visibleUpper = 0;
MBN_PROVIDER *pProvider = NULL;
CComPtr<IMbnInterface> pInterface = NULL;
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(hr))
{
goto ERROR_0;
}
hr = CoCreateInstance(CLSID_MbnInterfaceManager,
NULL,
CLSCTX_ALL,
IID_IMbnInterfaceManager,
(void**)&g_InterfaceMgr);
if (FAILED(hr))
{
goto ERROR_0;
}
hr = g_InterfaceMgr->GetInterface(interfaceID, & pInterface);
if (FAILED(hr))
{
goto ERROR_0;
}
ULONG age;
hr = pInterface->GetVisibleProviders(&age, &visibleProviders);
if (FAILED(hr))
{
goto ERROR_0;
}
hr = SafeArrayGetLBound(visibleProviders, 1, &visibleLower);
if (FAILED(hr))
{
goto ERROR_0;
}
hr = SafeArrayGetUBound(visibleProviders, 1, &visibleUpper);
if (FAILED(hr))
{
goto ERROR_0;
}
//don't check on the indexes of safearray to be positive
if (visibleLower > visibleUpper)
{
// There are no visible providers in this case.
hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
goto ERROR_0;
}
DWORD size = (visibleUpper - visibleLower + 1) * sizeof(BOOL);
DBG_UNREFERENCED_LOCAL_VARIABLE(size);
pProvider = (MBN_PROVIDER *)CoTaskMemAlloc(sizeof(MBN_PROVIDER));
if (!pProvider)
{
hr = E_OUTOFMEMORY;
goto ERROR_0;
}
for (LONG vIndex = visibleLower; vIndex <= visibleUpper; vIndex++)
{
//use zeromemory before accessing any elements in a safearray
ZeroMemory(pProvider, sizeof(MBN_PROVIDER));
hr = SafeArrayGetElement(visibleProviders, &vIndex, (void *)pProvider);
if (FAILED(hr))
{
continue;
}
}
ERROR_0:
if (visibleProviders)
{
SafeArrayDestroy(visibleProviders);
visibleProviders = NULL;
}
CoUninitialize();
}