mirror of https://github.com/tongzx/nt5src
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.
178 lines
3.7 KiB
178 lines
3.7 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
}
|