Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

192 lines
6.8 KiB

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 2000
*
* TITLE: RUNWIZ.CPP
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 6/14/2000
*
* DESCRIPTION: Present the device selection dialog and allow the user to select
* a device, then cocreate the server and generate the connection
* event.
*
*******************************************************************************/
#include "precomp.h"
#pragma hdrstop
#include "simstr.h"
#include "simbstr.h"
#include "runwiz.h"
#include "shmemsec.h"
namespace RunWiaWizard
{
static const GUID CLSID_AcquisitionManager = { 0xD13E3F25,0x1688,0x45A0,{ 0x97,0x43,0x75,0x9E,0xB3, 0x5C,0xDF,0x9A} };
HRESULT RunWizard( LPCTSTR pszDeviceId, HWND hWndParent, LPCTSTR pszUniqueIdentifier )
{
//
// Assume failure
//
HRESULT hr = E_FAIL;
//
// Get the device ID if one was not provided
//
CSimpleStringWide strwDeviceId;
if (!pszDeviceId || !lstrlen(pszDeviceId))
{
//
// Assume we will be asking for the device
//
bool bAskForDevice = true;
//
// This will automatically be cleaned up when we exit this scope
//
CSharedMemorySection<HWND> SelectionDialogSharedMemory;
//
// We only want to enforce uniqueness if we have a unique ID for this instance of the UI
//
if (pszUniqueIdentifier && *pszUniqueIdentifier)
{
//
// First, try to open it. If it exists, that means there is another instance running already.
//
CSharedMemorySection<HWND>::COpenResult OpenResult = SelectionDialogSharedMemory.Open( pszUniqueIdentifier, true );
if (CSharedMemorySection<HWND>::SmsOpened == OpenResult)
{
//
// We don't want to display the selection dialog
//
bAskForDevice = false;
//
// Tell the caller we cancelled
//
hr = S_FALSE;
//
// If we were able to open the shared memory section, there is already one running.
// so get a mutex'ed pointer to the shared memory.
//
HWND *pHwnd = SelectionDialogSharedMemory.Lock();
if (pHwnd)
{
//
// If we were able to get the pointer, get the window handle stored in it.
// Set bRun to false, so we don't start up a new wizard
//
if (*pHwnd && IsWindow(*pHwnd))
{
//
// Try to get any active windows
//
HWND hWndPopup = GetLastActivePopup(*pHwnd);
//
// If it is a valid window, bring it to the foreground.
//
SetForegroundWindow(hWndPopup);
}
//
// Release the mutex
//
SelectionDialogSharedMemory.Release();
}
}
else if (CSharedMemorySection<HWND>::SmsCreated == OpenResult)
{
//
// If we couldn't open it, we are the first instance, so store the parent window handle
//
HWND *phWnd = SelectionDialogSharedMemory.Lock();
if (phWnd)
{
*phWnd = hWndParent;
SelectionDialogSharedMemory.Release();
}
}
}
if (bAskForDevice)
{
//
// Create the device manager
//
CComPtr<IWiaDevMgr> pWiaDevMgr;
hr = CoCreateInstance( CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, (void**)&pWiaDevMgr );
if (SUCCEEDED(hr))
{
//
// Get the device ID
//
BSTR bstrDeviceId = NULL;
hr = pWiaDevMgr->SelectDeviceDlgID( hWndParent, 0, 0, &bstrDeviceId );
if (hr == S_OK && bstrDeviceId != NULL)
{
//
// Save the device ID and free the bstring
//
strwDeviceId = bstrDeviceId;
SysFreeString(bstrDeviceId);
}
}
}
}
else
{
//
// Save the provided device ID
//
strwDeviceId = CSimpleStringConvert::WideString(CSimpleString(pszDeviceId));
}
//
// If we have a valid device ID, continue
//
if (strwDeviceId.Length())
{
//
// Create the wizard
//
CComPtr<IWiaEventCallback> pWiaEventCallback;
hr = CoCreateInstance( CLSID_AcquisitionManager, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaEventCallback, (void**)&pWiaEventCallback );
if (SUCCEEDED(hr))
{
//
// Convert the parent window handle to a string, which we will pass as the event description
// The wizard will only use it this way if the event GUID is IID_NULL
//
CSimpleBStr bstrParentWindow( CSimpleString().Format( TEXT("%d"), hWndParent ) );
//
// Allow this process to set the foreground window
//
CoAllowSetForegroundWindow( pWiaEventCallback, NULL );
//
// Call the callback function
//
ULONG ulEventType = 0;
hr = pWiaEventCallback->ImageEventCallback( &IID_NULL,
bstrParentWindow.BString(),
CSimpleBStr(strwDeviceId),
NULL,
0,
NULL,
&ulEventType,
0);
}
}
return hr;
}
}