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.
|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1993 - 2000.
//
// File: CommonDialog.cpp
//
// Contents: implementation of CCommonDialog
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "commondialog.h"
HWND _VariantToHWND(const VARIANT& varOwner); // passportmanager.cpp
//
// ICommonDialog Interface
//
STDMETHODIMP CCommonDialog::get_Filter(BSTR* pbstrFilter) { if (!pbstrFilter) return E_POINTER;
*pbstrFilter = _strFilter.Copy(); return S_OK; }
STDMETHODIMP CCommonDialog::put_Filter(BSTR bstrFilter) { _strFilter = bstrFilter; return S_OK; }
STDMETHODIMP CCommonDialog::get_FilterIndex(UINT *puiFilterIndex) { if (!puiFilterIndex) return E_POINTER;
*puiFilterIndex = _dwFilterIndex; return S_OK; }
STDMETHODIMP CCommonDialog::put_FilterIndex(UINT uiFilterIndex) { _dwFilterIndex = uiFilterIndex; return S_OK; }
STDMETHODIMP CCommonDialog::get_FileName(BSTR* pbstrFileName) { if (!pbstrFileName) return E_POINTER;
*pbstrFileName = _strFileName.Copy(); return S_OK; }
STDMETHODIMP CCommonDialog::put_FileName(BSTR bstrFileName) { _strFileName = bstrFileName; return S_OK; }
STDMETHODIMP CCommonDialog::get_Flags(UINT *puiFlags) { if (!puiFlags) return E_POINTER;
*puiFlags = _dwFlags; return S_OK; }
STDMETHODIMP CCommonDialog::put_Flags(UINT uiFlags) { _dwFlags = uiFlags; return S_OK; }
STDMETHODIMP CCommonDialog::put_Owner(VARIANT varOwner) { HRESULT hr = E_INVALIDARG;
_hwndOwner = _VariantToHWND(varOwner); if (_hwndOwner) hr = S_OK;
return hr; }
STDMETHODIMP CCommonDialog::get_InitialDir(BSTR* pbstrInitialDir) { if (!pbstrInitialDir) return E_POINTER;
*pbstrInitialDir = _strInitialDir.Copy(); return S_OK; }
STDMETHODIMP CCommonDialog::put_InitialDir(BSTR bstrInitialDir) { _strInitialDir = bstrInitialDir; return S_OK; }
STDMETHODIMP CCommonDialog::ShowOpen(VARIANT_BOOL *pbSuccess) { OPENFILENAMEW ofn = { 0 }; WCHAR szFileName[MAX_PATH];
// Null characters can't be passed through script, so we separated
// name filter string combinations with the '|' character.
// The CommDlg32 api expects name/filter pairs to be separated by
// a null character, and the entire string to be double
// null terminated.
// copy the filter string (plus one for double null at the end)
CComBSTR strFilter(_strFilter.Length()+1, _strFilter); if (strFilter) { LPWSTR pch; int cch = lstrlenW(strFilter); for (pch = strFilter; cch > 0; ++pch, --cch) { if ( *pch == L'|' ) { *pch = L'\0'; } } // Double null terminate the string
++pch; *pch = L'\0'; }
// copy the initial file name, if any
if (_strFileName) { lstrcpynW(szFileName, _strFileName, ARRAYSIZE(szFileName)); } else { szFileName[0] = L'\0'; }
// set the struct members
ofn.lStructSize = SIZEOF(ofn); ofn.hwndOwner = _hwndOwner; ofn.lpstrFilter = strFilter; ofn.nFilterIndex = _dwFilterIndex; ofn.lpstrFile = szFileName; ofn.nMaxFile = ARRAYSIZE(szFileName); ofn.lpstrInitialDir = _strInitialDir; ofn.Flags = _dwFlags;
// make the call
if (GetOpenFileNameW(&ofn)) { _strFileName = szFileName; *pbSuccess = VARIANT_TRUE; } else { *pbSuccess = VARIANT_FALSE; }
return S_OK; }
|