Bewährte Methoden für mobile Breitband-API

Beim Arbeiten 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 von Managerobjekten wie IMbnInterfaceManager mithilfe der Enumerationsmethode für das entsprechende Managerobjekt abgerufen. Zwischenspeichern Sie diese funktionalen Objekte nicht, da zwischengespeicherte Funktionsobjekte 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 abgerufen werden.

Speichern Sie stattdessen die Manager-Objekte zwischen, und rufen Sie die funktionalen Objekte vom Manager-Objekt mithilfe der Enumerationsmethode für das entsprechende Managerobjekt erneut ab, um die neuesten Daten abzurufen.

Das folgende Codebeispiel veranschaulicht die richtige Methode zum Zwischenspeichern von Managerobjekten.

#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 behandeln 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 zu synchronisieren.

Auf einem Computer kann mehrere Verbindungs-Manager ausgeführt werden. Die von Windows 7 bereitgestellte native Benutzeroberfläche Verfügbare Netzwerkschnittstelle anzeigen ist ein Verbindungs-Manager. Alle anderen Verbindungs-Manager müssen auf alle Benachrichtigungen reagieren, damit die native Windows-Benutzeroberfläche synchronisiert bleibt. Ein Benutzer kann einen Vorgang für einen der Verbindungs-Manager ausfü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 z. B. eine Verbindung mit einem der Verbindungs-Manager ausführen, wird der Zustand des Geräts von verfügbar in verbunden geändert. 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 behandeln, 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 Aufheben der Blockierung anheften

Eine aufrufende Clientanwendung muss mit erhöhten Rechten versehen 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() vor dem Zugriff auf Elemente in einem SafeArray.

  • Überprüfen Sie nicht die Indizes eines SafeArrays. Sie können negativ sein.

Im folgenden Codebeispiel wird veranschaulicht, wie Sie ein SafeArray ordnungsgemäß behandeln.

#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();
}