You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
6.6 KiB
241 lines
6.6 KiB
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <tchar.h>
|
|
#include <windows.h>
|
|
#include "wia.h"
|
|
#include "sti.h"
|
|
|
|
//
|
|
// Please define MILL if you run it on Millennium
|
|
//
|
|
|
|
#define MILL 1
|
|
|
|
CLSID CLSID_Handler =
|
|
{
|
|
0xA0A45CB0,
|
|
0x8962,
|
|
0x11D2,
|
|
0xA9, 0xD3, 0x00, 0xA0, 0xC9, 0x06, 0x37, 0xD0
|
|
};
|
|
|
|
CLSID CLSID_Handler2 =
|
|
{
|
|
0xA0A45CB1,
|
|
0x8962,
|
|
0x11D2,
|
|
0xA9, 0xD3, 0x00, 0xA0, 0xC9, 0x06, 0x37, 0xD0
|
|
};
|
|
|
|
GUID GUID_Connected =
|
|
{
|
|
0xa28bbade,
|
|
0x64b6,
|
|
0x11d2,
|
|
0xa2, 0x31, 0x0, 0xc0, 0x4f, 0xa3, 0x18, 0x9
|
|
};
|
|
|
|
GUID GUID_DisConnected =
|
|
{
|
|
0x143e4e83,
|
|
0x6497,
|
|
0x11d2,
|
|
0xa2, 0x31, 0x0, 0xc0, 0x4f, 0xa3, 0x18, 0x9
|
|
};
|
|
|
|
int __cdecl main(int argc, char *argv[])
|
|
{
|
|
HRESULT hr;
|
|
IWiaDevMgr *pIDevMgr;
|
|
BSTR bstrName;
|
|
BSTR bstrDescription;
|
|
BSTR bstrIcon;
|
|
BSTR bstrDeviceID;
|
|
IWiaItem *pIRootItem;
|
|
IEnumWIA_DEV_CAPS *pIEnum;
|
|
WIA_EVENT_HANDLER wiaHandler;
|
|
ULONG ulFetched;
|
|
BSTR bstrProgram;
|
|
|
|
CoInitialize(NULL);
|
|
|
|
hr = CoCreateInstance(
|
|
CLSID_WiaDevMgr,
|
|
NULL,
|
|
CLSCTX_LOCAL_SERVER,
|
|
IID_IWiaDevMgr,
|
|
(void**)&pIDevMgr);
|
|
|
|
//
|
|
// Device 0001 on my mill machine and 0005 on my WIN2K is a DC260
|
|
//
|
|
|
|
#ifdef MILL
|
|
bstrDeviceID = SysAllocString(L"Image\\0000");
|
|
#else
|
|
bstrDeviceID = SysAllocString(
|
|
L"{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\\0001");
|
|
#endif
|
|
|
|
bstrName = SysAllocString(L"Download manager");
|
|
bstrDescription = SysAllocString(L"Microsoft Download manager");
|
|
bstrIcon = SysAllocString(L"downmgr.exe,-1000");
|
|
|
|
//
|
|
// Register a program
|
|
//
|
|
|
|
bstrProgram = SysAllocString(L"c:\\WINNT\\system32\\notepad.exe");
|
|
hr = pIDevMgr->RegisterEventCallbackProgram(
|
|
WIA_REGISTER_EVENT_CALLBACK,
|
|
NULL,
|
|
&GUID_Connected,
|
|
bstrProgram,
|
|
bstrName,
|
|
bstrDescription,
|
|
bstrIcon);
|
|
|
|
hr = pIDevMgr->RegisterEventCallbackProgram(
|
|
WIA_SET_DEFAULT_HANDLER,
|
|
bstrDeviceID,
|
|
&GUID_Connected,
|
|
bstrProgram,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
hr = pIDevMgr->RegisterEventCallbackProgram(
|
|
WIA_UNREGISTER_EVENT_CALLBACK,
|
|
bstrDeviceID,
|
|
&GUID_Connected,
|
|
bstrProgram,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
//
|
|
// Register 2 handlers
|
|
//
|
|
|
|
hr = pIDevMgr->RegisterEventCallbackCLSID(
|
|
WIA_REGISTER_EVENT_CALLBACK,
|
|
NULL,
|
|
&WIA_EVENT_DEVICE_CONNECTED,
|
|
&CLSID_Handler,
|
|
bstrName,
|
|
bstrDescription,
|
|
bstrIcon);
|
|
|
|
SysFreeString(bstrIcon);
|
|
bstrIcon = SysAllocString(L"downmgr.exe,-1001");
|
|
hr = pIDevMgr->RegisterEventCallbackCLSID(
|
|
WIA_REGISTER_EVENT_CALLBACK,
|
|
NULL,
|
|
&WIA_EVENT_DEVICE_DISCONNECTED,
|
|
&CLSID_Handler,
|
|
bstrName,
|
|
bstrDescription,
|
|
bstrIcon);
|
|
|
|
SysFreeString(bstrIcon);
|
|
bstrIcon = SysAllocString(L"downmgr.exe,-1002");
|
|
hr = pIDevMgr->RegisterEventCallbackCLSID(
|
|
WIA_REGISTER_EVENT_CALLBACK,
|
|
NULL,
|
|
&GUID_ScanImage,
|
|
&CLSID_Handler,
|
|
bstrName,
|
|
bstrDescription,
|
|
bstrIcon);
|
|
|
|
hr = pIDevMgr->RegisterEventCallbackCLSID(
|
|
WIA_SET_DEFAULT_HANDLER,
|
|
bstrDeviceID,
|
|
&WIA_EVENT_DEVICE_CONNECTED,
|
|
&CLSID_Handler,
|
|
NULL, // Name, description, Icon are not needed
|
|
NULL,
|
|
NULL);
|
|
hr = pIDevMgr->RegisterEventCallbackCLSID(
|
|
WIA_SET_DEFAULT_HANDLER,
|
|
bstrDeviceID,
|
|
&WIA_EVENT_DEVICE_DISCONNECTED,
|
|
&CLSID_Handler,
|
|
NULL, // Description and Icon is not necessary
|
|
NULL,
|
|
NULL);
|
|
|
|
//
|
|
// Register another handler for the 0001
|
|
//
|
|
|
|
hr = pIDevMgr->RegisterEventCallbackCLSID(
|
|
WIA_REGISTER_EVENT_CALLBACK,
|
|
bstrDeviceID,
|
|
&WIA_EVENT_DEVICE_CONNECTED,
|
|
&CLSID_Handler2,
|
|
bstrName,
|
|
bstrDescription,
|
|
bstrIcon);
|
|
|
|
//
|
|
// Create the device 0005
|
|
//
|
|
|
|
hr = pIDevMgr->CreateDevice(
|
|
bstrDeviceID,
|
|
&pIRootItem);
|
|
|
|
hr = pIRootItem->EnumRegisterEventInfo(
|
|
0,
|
|
&GUID_Connected,
|
|
&pIEnum);
|
|
|
|
if (hr == S_OK) {
|
|
|
|
//
|
|
// There will be at least one handler
|
|
//
|
|
|
|
do {
|
|
hr = pIEnum->Next(1, &wiaHandler, &ulFetched);
|
|
} while (hr == S_OK);
|
|
}
|
|
|
|
//
|
|
// Delete the handler specific to a device
|
|
//
|
|
|
|
hr = pIDevMgr->RegisterEventCallbackCLSID(
|
|
WIA_UNREGISTER_EVENT_CALLBACK,
|
|
bstrDeviceID,
|
|
&WIA_EVENT_DEVICE_DISCONNECTED,
|
|
&CLSID_Handler,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
//
|
|
// Delete the handler globally from all the devices
|
|
//
|
|
|
|
hr = pIDevMgr->RegisterEventCallbackCLSID(
|
|
WIA_UNREGISTER_EVENT_CALLBACK,
|
|
NULL,
|
|
&WIA_EVENT_DEVICE_CONNECTED,
|
|
&CLSID_Handler,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
//
|
|
// Garbage collection
|
|
//
|
|
|
|
pIDevMgr->Release();
|
|
|
|
CoUninitialize();
|
|
|
|
return (0);
|
|
}
|