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.
194 lines
4.2 KiB
194 lines
4.2 KiB
/*++
|
|
|
|
Copyright (C) 1999- Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
dllmain.cpp
|
|
|
|
Abstract:
|
|
|
|
This module implements the dll exported APIs
|
|
|
|
Author:
|
|
|
|
William Hsieh (williamh) created
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include "pch.h"
|
|
|
|
#include <locale.h>
|
|
|
|
HINSTANCE g_hInst;
|
|
|
|
//
|
|
// Entry point of this transport DLL
|
|
// Input:
|
|
// hInstance -- Instance handle of this dll
|
|
// dwReason -- reason why this entry was called.
|
|
// lpReserved -- reserved!
|
|
//
|
|
// Output:
|
|
// TRUE if our initialization went well
|
|
// FALSE if for GetLastError() reason, we failed.
|
|
//
|
|
BOOL
|
|
APIENTRY
|
|
DllMain(
|
|
HINSTANCE hInstance,
|
|
DWORD dwReason,
|
|
LPVOID lpReserved
|
|
)
|
|
{
|
|
switch (dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
DisableThreadLibraryCalls(hInstance);
|
|
|
|
g_hInst = hInstance;
|
|
|
|
//
|
|
// Set the locale to system default so that wcscmp and similary functions
|
|
// would work on non-unicode platforms(Millenium, for example).
|
|
//
|
|
setlocale(LC_ALL, "");
|
|
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
STDAPI
|
|
DllCanUnloadNow(void)
|
|
{
|
|
return CClassFactory::CanUnloadNow();
|
|
}
|
|
|
|
|
|
//
|
|
// This api returns an inteface on the given class object
|
|
// Input:
|
|
// rclsid -- the class object.
|
|
//
|
|
STDAPI
|
|
DllGetClassObject(
|
|
REFCLSID rclsid,
|
|
REFIID riid,
|
|
LPVOID *ppv
|
|
)
|
|
{
|
|
return CClassFactory::GetClassObject(rclsid, riid, ppv);
|
|
}
|
|
|
|
|
|
//
|
|
// GetDeviceName
|
|
//
|
|
// This function is called by Co-Installer (not by WIA!), and is used to obtain
|
|
// actual device name. This is necessary because all PTP cameras are installed with
|
|
// single generic INF file, and this INF file does not provide information about
|
|
// device name and manufacturer.
|
|
//
|
|
// Parameters:
|
|
// pwszPortName - this name will be used in CreateFile to open device
|
|
// pwszManufacturer - pointer to buffer provided by caller for Manufacturer name, may be NULL
|
|
// cchManufacturer - size of buffer, in characters
|
|
// pwszModelName - pointer to buffer provided by caller for Model name, may be NULL
|
|
// cchModelName - size of buffer, in characters
|
|
//
|
|
|
|
extern "C"
|
|
HRESULT
|
|
APIENTRY
|
|
GetDeviceName(
|
|
LPCWSTR pwszPortName,
|
|
WCHAR *pwszManufacturer,
|
|
DWORD cchManufacturer,
|
|
WCHAR *pwszModelName,
|
|
DWORD cchModelName
|
|
)
|
|
{
|
|
if (pwszPortName == NULL || pwszPortName[0] == 0)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
HRESULT hr = S_OK;
|
|
CPTPCamera *pPTPCamera = NULL;
|
|
CPtpDeviceInfo DeviceInfo;
|
|
|
|
//
|
|
// Create a new camera object.
|
|
//
|
|
pPTPCamera = new CUsbCamera;
|
|
if (pPTPCamera == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
//
|
|
// Open a connection to the camera
|
|
//
|
|
hr = pPTPCamera->Open((LPWSTR)pwszPortName, NULL, NULL, NULL, FALSE);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
|
|
//
|
|
// Query the camera for its DeviceInfo
|
|
//
|
|
hr = pPTPCamera->GetDeviceInfo(&DeviceInfo);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
|
|
//
|
|
// Copy the returned Manufacturer and/or ModelName into the OUT params.
|
|
//
|
|
if ((pwszManufacturer != NULL) &&
|
|
(cchManufacturer > 0) &&
|
|
(DeviceInfo.m_cbstrManufacturer.String() != NULL))
|
|
{
|
|
hr = StringCchCopy(pwszManufacturer, cchManufacturer, DeviceInfo.m_cbstrManufacturer.String());
|
|
if (FAILED(hr))
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
|
|
if ((pwszModelName != NULL) &&
|
|
(cchModelName > 0) &&
|
|
(DeviceInfo.m_cbstrModel.String() != NULL))
|
|
{
|
|
hr = StringCchCopy(pwszModelName, cchModelName, DeviceInfo.m_cbstrModel.String());
|
|
if (FAILED(hr))
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
|
|
Cleanup:
|
|
//
|
|
// Close the connection to the camera and delete the camera object.
|
|
//
|
|
if (pPTPCamera)
|
|
{
|
|
pPTPCamera->Close();
|
|
delete pPTPCamera;
|
|
}
|
|
|
|
return hr;
|
|
}
|