Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Když aplikace hodlá použít ovladač zařízení WIA, volá metodu IWiaDevMgr::CreateDevice (popsanou v dokumentaci k sadě Microsoft Windows SDK). Služba WIA nejprve volá IStiUSD::LockDevice k uzamčení ovladače WIA pro exkluzivní přístup. Dále služba WIA volá IWiaMiniDrv::d rvInitializeWia k vytvoření počáteční struktury stromu položek WIA. Služba WIA nakonec odemkne ovladač zařízení voláním IStiUSD::UnLockDevice.
IWiaMiniDrv::d rvInitializeWia metoda by měla provádět následující úlohy.
Kešujte rozhraní, na které parametr pStiDevice odkazuje, pro správné zamykání zařízení. (Další informace naleznete v tématu IWiaMiniDrv::drvLockWiaDevice.)
Vytvořte počáteční strukturu stromu položek WIA.
Zvyšte aktuální počet připojení aplikace. Tento počet slouží k informování ovladače o tom, jestli je aplikace stále připojená. Pomáhá také určit správnou akci, která se má provést v IWiaMiniDrv::drvUnInitializeWia.
Položky WIA by měly mít nějaký logický význam. Společnost Microsoft vyžaduje následující názvy položek pro systém Windows XP a novější.
Kořen
Toto je termín pro kořenovou položku stromu položek WIA.
Plochý
Toto je termín pro skener, který podporuje pouze skener s plochým ložem, nebo skener s plochým ložem a podavačem dokumentů.
Krmítko
Toto je termín pro skener, který je vybaven pouze podavačem.
Služba WIA volá metodu IWiaMiniDrv::d rvInitializeWia v reakci na volání aplikace WIA IWiaDevMgr::CreateDevice (popsané v dokumentaci k sadě Windows SDK). Důsledkem je to, že služba WIA volá metodu IWiaMiniDrv::d rvInitializeWia pro každé nové připojení klienta.
IWiaMiniDrv::d rvInitializeWia metoda by měla inicializovat všechny privátní struktury a vytvořit strom položky ovladače. Strom položek ovladače zobrazuje rozložení všech položek WIA podporovaných tímto zařízením WIA. Tato metoda slouží pouze k vytvoření počáteční stromové struktury, nikoli obsahu (vlastnosti WIA). Služba WIA individuálně naplní vlastnosti WIA pro položky ovladače WIA provedením více volání metody IWiaMiniDrv::drvInitItemProperties.
Všechna zařízení WIA mají kořenovou položku, která je nadřazená všem položkám zařízení WIA. Pokud chcete vytvořit položku zařízení WIA, ovladač WIA by měl volat pomocnou funkci služby WIA, wiasCreateDrvItem.
Následující příklad ukazuje, jak vytvořit kořenovou položku zařízení WIA.
LONG lItemFlags = WiaItemTypeFolder|WiaItemTypeDevice|WiaItemTypeRoot;
IWiaDrvItem *pIWiaDrvRootItem = NULL;
HRESULT hr =
wiasCreateDrvItem(
lItemFlags, // item flags
bstrRootItemName, // item name ("Root")
bstrRootFullItemName, // item full name ("0000\Root")
(IWiaMiniDrv *)this, // this WIA driver object
sizeof(MINIDRIVERITEMCONTEXT), // size of context
NULL, // context
&pIWiaDrvRootItem // created ROOT item
); // (IWiaDrvItem interface)
if(S_OK == hr){
//
// ROOT item was created successfully
//
}
Chcete-li vytvořit podřízenou položku WIA, která se nachází přímo pod kořenovou položkou vytvořenou v předchozím příkladu, použijte kód podobný následujícímu.
Poznámka **** Všimněte si, že IWiaDrvItem::AddItemToFolder metoda je volána pro přidání nově vytvořené podřízené položky do kořenové položky.
LONG lItemFlags = WiaItemTypeFile|WiaItemTypeDevice|WiaItemTypeImage;
PMINIDRIVERITEMCONTEXT pItemContext = NULL;
IWiaDrvItem *pIWiaDrvNewItem = NULL;
HRESULT hr =
wiasCreateDrvItem(
lItemFlags, // item flags
bstrItemName, // item name ("Flatbed")
bstrFullItemName, // item full name ("0000\Root\Flatbed")
(IWiaMiniDrv *)this, // this WIA driver object
sizeof(MINIDRIVERITEMCONTEXT), // size of context
(PBYTE)&pItemContext, // context
&pIWiaDrvNewItem // created child item
); // (IWiaDrvItem interface)
if(S_OK == hr){
//
// A New WIA driver item was created successfully
//
hr = pIWiaDrvNewItem->AddItemToFolder(pIWiaDrvRootItem); // add the new item to the ROOT
if(S_OK == hr){
//
// successfully created and added a new WIA driver item to
// the WIA driver item tree.
//
}
pNewItem->Release();
pNewItem = NULL;
}
Následující příklad ukazuje implementaci IWiaMiniDrv::d rvInitializeWia metoda.
HRESULT _stdcall CWIADevice::drvInitializeWia(
BYTE *pWiasContext,
LONG lFlags,
BSTR bstrDeviceID,
BSTR bstrRootFullItemName,
IUnknown *pStiDevice,
IUnknown *pIUnknownOuter,
IWiaDrvItem **ppIDrvItemRoot,
IUnknown **ppIUnknownInner,
LONG *plDevErrVal)
{
//
// If the caller did not pass in the correct parameters,
// then fail the call with E_INVALIDARG.
//
if (!pWiasContext) {
return E_INVALIDARG;
}
if (!plDevErrVal) {
return E_INVALIDARG;
}
HRESULT hr = S_OK;
*plDevErrVal = 0;
*ppIDrvItemRoot = NULL;
*ppIUnknownInner = NULL;
if (m_pStiDevice == NULL) {
//
// save STI device interface for locking
//
m_pStiDevice = (IStiDevice *)pStiDevice;
}
//
// build WIA item tree
//
LONG lItemFlags = WiaItemTypeFolder|WiaItemTypeDevice|WiaItemTypeRoot;
IWiaDrvItem *pIWiaDrvRootItem = NULL;
//
// create the ROOT item of the WIA device. This name should NOT be
// localized in different languages. "Root" is used by WIA drivers.
//
BSTR bstrRootItemName = SysAllocString(WIA_DEVICE_ROOT_NAME);
if(!bstrRootItemName) {
return E_OUTOFMEMORY;
}
hr = wiasCreateDrvItem(lItemFlags, // item flags
bstrRootItemName, // item name ("Root")
bstrRootFullItemName, // item full name ("0000\Root")
(IWiaMiniDrv *)this, // this WIA driver object
sizeof(MINIDRIVERITEMCONTEXT), // size of context
NULL, // context
&pIWiaDrvRootItem); // created ROOT item
// (IWiaDrvItem interface)
if (S_OK == hr) {
//
// ROOT item was created successfully, save the newly created Root
// item in the pointer given by the WIA service (ppIDrvItemRoot).
//
*ppIDrvItemRoot = pIWiaDrvRootItem;
//
// Create a child item directly under the Root WIA item
//
lItemFlags = WiaItemTypeFile|WiaItemTypeDevice|WiaItemTypeImage;
PMINIDRIVERITEMCONTEXT pItemContext = NULL;
IWiaDrvItem *pIWiaDrvNewItem = NULL;
//
// create a name for the WIA child item. "Flatbed" is used by
// WIA drivers that support a flatbed scanner.
//
BSTR bstrItemName = SysAllocString(WIA_DEVICE_FLATBED_NAME);
if (bstrItemName) {
WCHAR wszFullItemName[MAX_PATH + 1] = {0};
_snwprintf(wszFullItemName,(sizeof(wszFullItemName) / sizeof(WCHAR)) - 1,L"%ls\\%ls",
bstrRootFullItemName,bstrItemName);
BSTR bstrFullItemName = SysAllocString(wszFullItemName);
if (bstrFullItemName) {
hr = wiasCreateDrvItem(lItemFlags, // item flags
bstrItemName, // item name ("Flatbed")
trFullItemName, // item full name ("0000\Root\Flatbed")
(IWiaMiniDrv *)this, // this WIA driver object
sizeof(MINIDRIVERITEMCONTEXT), // size of context
(BYTE**)&pItemContext, // context
&pIWiaDrvNewItem); // created child item
// (IWiaDrvItem interface)
if (S_OK == hr) {
//
// A New WIA driver item was created successfully
//
hr = pIWiaDrvNewItem->AddItemToFolder(pIWiaDrvRootItem); // add the new item to the ROOT
if (S_OK == hr) {
//
// successfully created and added a new WIA
// driver item to the WIA driver item tree.
//
}
//
// The new item is no longer needed, because it has
// been passed to the WIA service.
//
pIWiaDrvNewItem->Release();
pIWiaDrvNewItem = NULL;
}
SysFreeString(bstrFullItemName);
bstrFullItemName = NULL;
} else {
hr = E_OUTOFMEMORY;
}
SysFreeString(bstrItemName);
bstrItemName = NULL;
} else {
hr = E_OUTOFMEMORY;
}
}
//
// increment application connection count
//
if(S_OK == hr){
InterlockedIncrement(&m_lClientsConnected);
}
return hr;
}