//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: sampcpl.cpp // //-------------------------------------------------------------------------- #define INITGUID #include "Sampcpl.h" #include #include "resource.h" BOOL WINAPI IsPlatformNT(); /***************************************************************************** * * Globals * *****************************************************************************/ // Reference counter for the whole library DWORD g_cRef; // DLL module instance HINSTANCE g_hInst; // Can we use UNICODE APIs BOOL g_NoUnicodePlatform = TRUE; // Is COM initialized BOOL g_COMInitialized = FALSE; // PSTI g_pSti = NULL; /***************************************************************************** * * Code * *****************************************************************************/ /***************************************************************************** * * @doc INTERNAL * * @func BOOL | DllEntryPoint | * * Called to notify the DLL about various things that can happen. * * We are not interested in thread attaches and detaches, * so we disable thread notifications for performance reasons. * * @parm HINSTANCE | hinst | * * The instance handle of this DLL. * * @parm DWORD | dwReason | * * Notification code. * * @parm LPVOID | lpReserved | * * Not used. * * @returns * * Returns to allow the DLL to load. * *****************************************************************************/ extern "C" DLLEXPORT BOOL APIENTRY DllEntryPoint(HINSTANCE hinst, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: g_hInst = hinst; ::DisableThreadLibraryCalls(hinst); // Set global flags g_NoUnicodePlatform = !IsPlatformNT(); break; case DLL_PROCESS_DETACH: if (g_cRef) { } break; } return 1; } extern "C" DLLEXPORT BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID lpReserved) { return DllEntryPoint(hinst, dwReason, lpReserved); } BOOL CALLBACK USDSampPropDialog( HWND hwnd, UINT uMessage, WPARAM wp, LPARAM lp ) { PSTI_DEVICE_INFORMATION psdi; HRESULT hres; switch (uMessage) { case WM_INITDIALOG: // On WM_INITDIALOG, the LPARAM points at the PROPSHEETPAGE that created // us. We walk down to the lParam member to find the pointer to this // STI device. TCHAR szPath[MAX_PATH]; // Request STI interface pointer g_pSti = NULL; hres = ::StiCreateInstance(::GetModuleHandle(NULL), STI_VERSION, &g_pSti, NULL); psdi = (PSTI_DEVICE_INFORMATION) ((LPPROPSHEETPAGE) lp) -> lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) psdi); *szPath = TEXT('\0'); #ifndef UNICODE WideCharToMultiByte(CP_ACP, 0, psdi->pszPortName,-1, szPath,sizeof(szPath), NULL,NULL); #else lstrcpy(szPath,psdi->pszPortName); #endif Edit_SetText(GetDlgItem(hwnd,IDC_EDIT_PATH),szPath); Edit_LimitText(GetDlgItem(hwnd,IDC_EDIT_PATH), MAX_PATH); return TRUE; case WM_COMMAND: { if (GET_WM_COMMAND_ID(wp,lp) == IDC_BUTTON_BROWSE && GET_WM_COMMAND_CMD(wp,lp) == BN_CLICKED) { static TCHAR szAppFilter[]=TEXT("Files\0*.*\0All Files\0*.*\0"); TCHAR szFileName[MAX_PATH]; OPENFILENAME ofn; DWORD dwLastError; szFileName[0] = TEXT('\0'); /* prompt user for file to open */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwnd; ofn.hInstance = NULL; ofn.lpstrFilter = szAppFilter; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 0; ofn.lpstrFile = szFileName; ofn.nMaxFile = sizeof(szFileName); ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = NULL; ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_EXPLORER; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = NULL; ofn.lCustData = 0; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL; if (GetOpenFileName(&ofn)) { Edit_SetText(GetDlgItem(hwnd,IDC_EDIT_PATH),szFileName); } else { dwLastError = ::GetLastError(); } return TRUE; } else if (GET_WM_COMMAND_ID(wp,lp) == IDC_EDIT_PATH && GET_WM_COMMAND_CMD(wp,lp) == EN_CHANGE ) { // Enable Apply button SendMessage(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0); return TRUE; } } break; case WM_DESTROY: // Destroy things g_pSti->Release(); g_pSti = NULL; break; case WM_NOTIFY: { LPNMHDR lpnmh = (LPNMHDR) lp; if ( lpnmh -> code == PSN_APPLY ) { // Write path to the registry psdi = (PSTI_DEVICE_INFORMATION)GetWindowLong(hwnd, DWLP_USER); if (psdi && g_pSti) { TCHAR szPath[MAX_PATH]; WCHAR wszPath[MAX_PATH]; szPath[0] = '\0'; wszPath[0] = L'\0'; g_pSti->WriteToErrorLog(STI_TRACE_INFORMATION, L"Writing new path to the registry for Sample USD" ); GetWindowText(GetDlgItem(hwnd,IDC_EDIT_PATH),szPath,sizeof(szPath)); if (*szPath) { HRESULT hres; STI_DEVICE_INFORMATION sdiNew; STI_DEVICE_INFORMATION *psdiNew = &sdiNew; CopyMemory(psdiNew,psdi,sizeof(STI_DEVICE_INFORMATION)); #ifndef UNICODE MultiByteToWideChar(CP_ACP, 0, szPath,-1, wszPath,sizeof(wszPath)); #else lstrcpy(wszPath,szPath); #endif psdiNew->pszPortName = wszPath; hres = g_pSti->SetupDeviceParameters(psdiNew); if (!SUCCEEDED(hres)) { g_pSti->WriteToErrorLog(STI_TRACE_ERROR, L"Could not save new port name" ); } } } } } default: ; } return FALSE; } PROPSHEETPAGE psp = {sizeof psp, PSP_DEFAULT }; typedef BOOL (WINAPI *ADDER)(HPROPSHEETPAGE hpsp, LPARAM lp); extern "C" BOOL WINAPI EnumStiPropPages( PSTI_DEVICE_INFORMATION psdi, ADDER adder, LPARAM lp ) { psp.hInstance = g_hInst; psp.pszTemplate = MAKEINTRESOURCE(IDD_PAGE_GENERAL); psp.pfnDlgProc = (DLGPROC)USDSampPropDialog; psp.lParam = (LPARAM) psdi; HPROPSHEETPAGE hpsp = CreatePropertySheetPage(&psp); if (!hpsp || !(*adder)(hpsp, lp)) { if (hpsp) { DestroyPropertySheetPage(hpsp); } return FALSE; // We failed to add anything... } return TRUE; } BOOL WINAPI IsPlatformNT( VOID ) { OSVERSIONINFO ver; BOOL bReturn = FALSE; ZeroMemory(&ver,sizeof(ver)); ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if(!GetVersionEx(&ver)) { bReturn = FALSE; } else { switch(ver.dwPlatformId) { case VER_PLATFORM_WIN32_WINDOWS: bReturn = FALSE; break; case VER_PLATFORM_WIN32_NT: bReturn = TRUE; break; default: bReturn = FALSE; break; } } return bReturn; } // endproc