Vývoj rozhraní pomocí popisovačů kontextu

Obvykle vytvoříte kontextový popisovač zadáním atributu [context_handle] pro definici typu v souboru IDL. Definice typu také implicitně určuje rutinu spuštění kontextu, kterou musíte zadat. Pokud komunikace mezi klientem a serverem selže, běhové prostředí serveru vyvolá tuto proceduru k provedení potřebného vyčištění. Další informace o rutinách spuštění kontextu naleznete v tématu Server Context Run-down Rutina.

Rozhraní, které používá popisovač kontextu, musí mít popisovač vazby pro počáteční vazbu, který musí proběhnout před tím, než server může vrátit kontextový popisovač. K vytvoření vazby a vytvoření kontextu můžete použít automatický, implicitní nebo explicitní popisovač vazby.

Popisovač kontextu musí být typu void * nebo typu, který je ekvivalentní s void *. Serverový program ho přetypuje na požadovaný typ.

Poznámka

Použití [v, out] pro parametry kontextových popisovačů se nedoporučuje s výjimkou rutin, které uzavírají kontextové popisovače. Pokud se použijí parametry označené jako [v, out], nepředávejte NULL nebo neinicializovaný kontextový popisovač na server. Místo toho má být předán ukazatel NULL na popisovač kontextu. Upozorňujeme, že parametry popisovače kontextu označené jako [v] nepřijímají ukazatele NULL.

 

Následující fragment ukázkové definice rozhraní ukazuje, jak distribuovaná aplikace může použít popisovač kontextu k otevření serveru a aktualizaci datového souboru pro každého klienta.

Rozhraní musí obsahovat vzdálené volání procedury pro inicializaci popisovače a jeho nastavení na hodnotu, která nenínull. V tomto příkladu funkce RemoteOpen provede tuto operaci. Určuje kontextový popisovač se směrovým atributem [out]. Případně můžete vrátit popisovač kontextu jako návratovou hodnotu procedury. V tomto příkladu ale předáme popisovač kontextu prostřednictvím seznamu parametrů.

V tomto příkladu jsou kontextové informace popisovačem souboru. Sleduje aktuální umístění v souboru. Rozhraní balí popisovač souboru jako kontextový popisovač a předá ho jako parametr vzdáleným voláním procedur. Struktura obsahuje název souboru a popisovač souboru.

/* file: cxhndl.idl (fragment of interface definition file) */
typedef [context_handle] void * PCONTEXT_HANDLE_TYPE;
typedef [ref] PCONTEXT_HANDLE_TYPE * PPCONTEXT_HANDLE_TYPE;
 
short RemoteOpen([out] PPCONTEXT_HANDLE_TYPE pphContext,
    [in, string] unsigned char * pszFile);
 
void RemoteRead(
    [in] PCONTEXT_HANDLE_TYPE phContext,
    [out, size_is(cbBuf)] unsigned char achBuf[],
    [in, out] short *pcbBuf);
 
short RemoteClose([in, out] PPCONTEXT_HANDLE_TYPE pphContext);

Funkce RemoteOpen vytvoří platný, ne-null kontextový popisovač. Předá klientovi kontextový popisovač. Další vzdálená volání procedur, například RemoteRead, používají kontextový popisovač jako vstupní ukazatel.

Kromě vzdálené procedury, která inicializuje popisovač kontextu, musí rozhraní obsahovat proceduru, která uvolní kontext serveru a nastaví popisovač kontextu na NULL. V předchozím příkladu provede funkce RemoteClose tuto operaci.