1803 lines
57 KiB
C
1803 lines
57 KiB
C
/*
|
||
* CONVERT.C
|
||
*
|
||
* Implements the OleUIConvert function which invokes the complete
|
||
* Convert dialog.
|
||
*
|
||
* Copyright (c)1992 Microsoft Corporation, All Right Reserved
|
||
*/
|
||
|
||
#define STRICT 1
|
||
#include "ole2ui.h"
|
||
#include <stdlib.h>
|
||
#include "common.h"
|
||
#include "utility.h"
|
||
#include "geticon.h"
|
||
#include "regdb.h"
|
||
#include "convert.h"
|
||
|
||
#define CF_CLIPBOARDMIN 0xc000
|
||
#define CF_CLIPBOARDMAX 0xffff
|
||
|
||
#define AUXUSERTYPE_SHORTNAME USERCLASSTYPE_SHORT // short name
|
||
|
||
static TCHAR szOLE2DLL[] = TEXT("ole2.dll"); // name of OLE 2.0 library
|
||
|
||
static TCHAR szVanillaDocIcon[] = TEXT("DefIcon");
|
||
|
||
/*
|
||
* OleUIConvert
|
||
*
|
||
* Purpose:
|
||
* Invokes the standard OLE Change Type dialog box allowing the user
|
||
* to change the type of the single specified object, or change the
|
||
* type of all OLE objects of a specified type.
|
||
*
|
||
* Parameters:
|
||
* lpCV LPOLEUICONVERT pointing to the in-out structure
|
||
* for this dialog.
|
||
*
|
||
* Return Value:
|
||
* UINT One of the following codes, indicating success or error:
|
||
* OLEUI_SUCCESS Success
|
||
* OLEUI_ERR_STRUCTSIZE The dwStructSize value is wrong
|
||
*/
|
||
|
||
STDAPI_(UINT) OleUIConvert(LPOLEUICONVERT lpCV)
|
||
{
|
||
UINT uRet;
|
||
HGLOBAL hMemDlg=NULL;
|
||
|
||
uRet=UStandardValidation((LPOLEUISTANDARD)lpCV, sizeof(OLEUICONVERT)
|
||
, &hMemDlg);
|
||
|
||
if (OLEUI_SUCCESS!=uRet)
|
||
return uRet;
|
||
|
||
// Validate structure members passed in.
|
||
#if defined( OBSOLETE )
|
||
if (!IsValidClassID(lpCV->clsid))
|
||
uRet = OLEUI_CTERR_CLASSIDINVALID;
|
||
#endif
|
||
|
||
if ( (lpCV->dwFlags & CF_SETCONVERTDEFAULT)
|
||
&& (!IsValidClassID(lpCV->clsidConvertDefault)) )
|
||
uRet = OLEUI_CTERR_CLASSIDINVALID;
|
||
|
||
if ( (lpCV->dwFlags & CF_SETACTIVATEDEFAULT)
|
||
&& (!IsValidClassID(lpCV->clsidActivateDefault)) )
|
||
uRet = OLEUI_CTERR_CLASSIDINVALID;
|
||
|
||
if ( (lpCV->dvAspect != DVASPECT_ICON)
|
||
&& (lpCV->dvAspect != DVASPECT_CONTENT) )
|
||
uRet = OLEUI_CTERR_DVASPECTINVALID;
|
||
|
||
if ( (lpCV->wFormat >= CF_CLIPBOARDMIN)
|
||
&& (lpCV->wFormat <= CF_CLIPBOARDMAX) )
|
||
{
|
||
TCHAR szTemp[8];
|
||
|
||
if (0 == GetClipboardFormatName(lpCV->wFormat, (LPTSTR)szTemp, 8))
|
||
uRet = OLEUI_CTERR_CBFORMATINVALID;
|
||
}
|
||
|
||
|
||
if ( (NULL != lpCV->lpszUserType)
|
||
&& (IsBadReadPtr(lpCV->lpszUserType, 1)) )
|
||
uRet = OLEUI_CTERR_STRINGINVALID;
|
||
|
||
if ( (NULL != lpCV->lpszDefLabel)
|
||
&& (IsBadReadPtr(lpCV->lpszDefLabel, 1)) )
|
||
uRet = OLEUI_CTERR_STRINGINVALID;
|
||
|
||
if (0!=lpCV->cClsidExclude)
|
||
{
|
||
if (NULL!=lpCV->lpClsidExclude && IsBadReadPtr(lpCV->lpClsidExclude
|
||
, lpCV->cClsidExclude*sizeof(CLSID)))
|
||
uRet=OLEUI_IOERR_LPCLSIDEXCLUDEINVALID;
|
||
}
|
||
|
||
|
||
if (OLEUI_ERR_STANDARDMIN <= uRet)
|
||
{
|
||
if (NULL!=hMemDlg)
|
||
FreeResource(hMemDlg);
|
||
|
||
return uRet;
|
||
}
|
||
|
||
//Now that we've validated everything, we can invoke the dialog.
|
||
uRet=UStandardInvocation(ConvertDialogProc, (LPOLEUISTANDARD)lpCV,
|
||
hMemDlg, MAKEINTRESOURCE(IDD_CONVERT));
|
||
|
||
return uRet;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
* ConvertDialogProc
|
||
*
|
||
* Purpose:
|
||
* Implements the OLE Convert dialog as invoked through the
|
||
* OleUIConvert function.
|
||
*
|
||
* Parameters:
|
||
* Standard
|
||
*
|
||
* Return Value:
|
||
* Standard
|
||
*
|
||
*/
|
||
|
||
BOOL CALLBACK EXPORT ConvertDialogProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
LPCONVERT lpCV;
|
||
UINT uRet = 0;
|
||
OLEUICHANGEICON ci;
|
||
|
||
//Declare Win16/Win32 compatible WM_COMMAND parameters.
|
||
COMMANDPARAMS(wID, wCode, hWndMsg);
|
||
|
||
//This will fail under WM_INITDIALOG, where we allocate it.
|
||
lpCV=(LPCONVERT)LpvStandardEntry(hDlg, iMsg, wParam, lParam, (UINT FAR *)&uRet);
|
||
|
||
//If the hook processed the message, we're done.
|
||
if (0!=uRet)
|
||
return (BOOL)uRet;
|
||
|
||
//Process the temination message
|
||
if (iMsg==uMsgEndDialog)
|
||
{
|
||
ConvertCleanup(hDlg, lpCV);
|
||
StandardCleanup(lpCV, hDlg);
|
||
EndDialog(hDlg, wParam);
|
||
return TRUE;
|
||
}
|
||
|
||
// Process help message from Change Icon
|
||
if (iMsg == uMsgHelp)
|
||
{
|
||
|
||
PostMessage(lpCV->lpOCV->hWndOwner, uMsgHelp, wParam, lParam);
|
||
return FALSE;
|
||
|
||
}
|
||
|
||
switch (iMsg)
|
||
{
|
||
case WM_INITDIALOG:
|
||
FConvertInit(hDlg, wParam, lParam);
|
||
return TRUE;
|
||
|
||
case WM_COMMAND:
|
||
switch (wID)
|
||
{
|
||
case IDCV_ACTIVATELIST:
|
||
case IDCV_CONVERTLIST:
|
||
switch (wCode)
|
||
{
|
||
case LBN_SELCHANGE:
|
||
|
||
// Change "Results" window to reflect current selection
|
||
SetConvertResults(hDlg, lpCV);
|
||
|
||
// Update the icon we display, if we are indeed
|
||
// displaying an icon.
|
||
if ( (lpCV->dwFlags & CF_SELECTCONVERTTO)
|
||
&& (lpCV->dvAspect == DVASPECT_ICON)
|
||
&& (!lpCV->fCustomIcon) )
|
||
UpdateCVClassIcon(hDlg, lpCV, hWndMsg);
|
||
|
||
break;
|
||
|
||
case LBN_DBLCLK:
|
||
//Same as pressing OK.
|
||
SendCommand(hDlg, IDOK, BN_CLICKED, hWndMsg);
|
||
break;
|
||
}
|
||
break;
|
||
|
||
case IDCV_CONVERTTO:
|
||
case IDCV_ACTIVATEAS:
|
||
{
|
||
HWND hList, hListInvisible;
|
||
LRESULT lRetVal;
|
||
BOOL fState;
|
||
|
||
hList = lpCV->hListVisible;
|
||
hListInvisible = lpCV->hListInvisible;
|
||
|
||
|
||
if (IDCV_CONVERTTO == wParam)
|
||
{
|
||
|
||
// User just click on the button again - it was
|
||
// already selected.
|
||
if (lpCV->dwFlags & CF_SELECTCONVERTTO)
|
||
break;
|
||
|
||
|
||
// Turn painting updates off.
|
||
SendMessage(hDlg, WM_SETREDRAW, FALSE, 0L);
|
||
|
||
|
||
// If we're working with a linked object, don't
|
||
// add the activate list - just the object's
|
||
// class should appear in the listbox.
|
||
|
||
SwapWindows(hDlg,
|
||
hList,
|
||
hListInvisible);
|
||
|
||
lpCV->hListVisible = hListInvisible;
|
||
lpCV->hListInvisible = hList;
|
||
|
||
EnableWindow(lpCV->hListInvisible, FALSE);
|
||
EnableWindow(lpCV->hListVisible, TRUE);
|
||
|
||
// Update our flags.
|
||
lpCV->dwFlags &= ~CF_SELECTACTIVATEAS;
|
||
lpCV->dwFlags |= CF_SELECTCONVERTTO;
|
||
|
||
}
|
||
else
|
||
{
|
||
if (lpCV->dwFlags & CF_SELECTACTIVATEAS)
|
||
break;
|
||
|
||
// Turn painting updates off.
|
||
SendMessage(hDlg, WM_SETREDRAW, FALSE, 0L);
|
||
|
||
SwapWindows(hDlg,
|
||
hList,
|
||
hListInvisible);
|
||
|
||
lpCV->hListVisible = hListInvisible;
|
||
lpCV->hListInvisible = hList;
|
||
|
||
EnableWindow(lpCV->hListInvisible, FALSE);
|
||
EnableWindow(lpCV->hListVisible, TRUE);
|
||
|
||
|
||
// Update our flags.
|
||
lpCV->dwFlags |= CF_SELECTACTIVATEAS;
|
||
lpCV->dwFlags &= ~CF_SELECTCONVERTTO;
|
||
}
|
||
|
||
|
||
if (lpCV->dwFlags & CF_SELECTCONVERTTO)
|
||
lRetVal = SendMessage(lpCV->hListVisible, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)lpCV->lpszConvertDefault);
|
||
else
|
||
lRetVal = SendMessage(lpCV->hListVisible, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)lpCV->lpszActivateDefault);
|
||
|
||
if (LB_ERR == lRetVal)
|
||
{
|
||
TCHAR szCurrentObject[40];
|
||
|
||
GetDlgItemText(hDlg, IDCV_OBJECTTYPE, (LPTSTR)szCurrentObject, 40);
|
||
SendMessage(lpCV->hListVisible, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)(LPTSTR)szCurrentObject);
|
||
}
|
||
|
||
// Turn updates back on.
|
||
SendMessage(hDlg, WM_SETREDRAW, TRUE, 0L);
|
||
|
||
InvalidateRect(lpCV->hListVisible, NULL, TRUE);
|
||
UpdateWindow(lpCV->hListVisible);
|
||
|
||
if ((lpCV->dvAspect & DVASPECT_ICON) && (lpCV->dwFlags & CF_SELECTCONVERTTO))
|
||
UpdateCVClassIcon(hDlg, lpCV, lpCV->hListVisible);
|
||
|
||
// Hide the icon stuff when Activate is selected...show
|
||
// it again when Convert is selected.
|
||
|
||
fState = ((lpCV->dwFlags & CF_SELECTACTIVATEAS) ||
|
||
(lpCV->dwFlags & CF_DISABLEDISPLAYASICON)) ?
|
||
SW_HIDE : SW_SHOW;
|
||
|
||
StandardShowDlgItem(hDlg, IDCV_DISPLAYASICON, fState);
|
||
|
||
// Only display the icon if convert is selected AND
|
||
// display as icon is checked.
|
||
if ((SW_SHOW==fState) && (DVASPECT_ICON!=lpCV->dvAspect))
|
||
fState = SW_HIDE;
|
||
|
||
StandardShowDlgItem(hDlg, IDCV_CHANGEICON, fState);
|
||
StandardShowDlgItem(hDlg, IDCV_ICON, fState);
|
||
StandardShowDlgItem(hDlg, IDCV_ICONLABEL1, fState);
|
||
StandardShowDlgItem(hDlg, IDCV_ICONLABEL2, fState);
|
||
|
||
SetConvertResults(hDlg, lpCV);
|
||
|
||
}
|
||
break;
|
||
|
||
|
||
case IDOK:
|
||
{
|
||
|
||
LRESULT iCurSel;
|
||
LPTSTR lpszCLSID;
|
||
TCHAR szBuffer[256];
|
||
|
||
// Set OUT parameters
|
||
|
||
//
|
||
// Set output flags to current ones
|
||
//
|
||
lpCV->lpOCV->dwFlags = lpCV->dwFlags;
|
||
|
||
|
||
// Update the dvAspect and fObjectsIconChanged members
|
||
// as appropriate.
|
||
//
|
||
if (lpCV->dwFlags & CF_SELECTACTIVATEAS)
|
||
{
|
||
// DON'T update aspect if activate as was selected.
|
||
lpCV->lpOCV->fObjectsIconChanged = FALSE;
|
||
}
|
||
else
|
||
lpCV->lpOCV->dvAspect = lpCV->dvAspect;
|
||
|
||
|
||
//
|
||
// Get the new clsid
|
||
//
|
||
iCurSel = SendMessage(lpCV->hListVisible, LB_GETCURSEL, 0, 0);
|
||
SendMessage(lpCV->hListVisible, LB_GETTEXT, iCurSel, (LPARAM)szBuffer);
|
||
|
||
lpszCLSID = PointerToNthField((LPTSTR)szBuffer, 2, TEXT('\t'));
|
||
|
||
CLSIDFromStringA(lpszCLSID, (&(lpCV->lpOCV->clsidNew)));
|
||
|
||
// Free the hMetaPict we got in.
|
||
OleUIMetafilePictIconFree(lpCV->lpOCV->hMetaPict);
|
||
|
||
//
|
||
// Get the hMetaPict (if display as icon is checked)
|
||
//
|
||
if (DVASPECT_ICON == lpCV->dvAspect)
|
||
{
|
||
HICON hIcon;
|
||
TCHAR szLabel[OLEUI_CCHLABELMAX];
|
||
INT Index;
|
||
|
||
|
||
// Create the hMetaPict here from icon, label,
|
||
// index, and path
|
||
|
||
hIcon = (HICON)SendDlgItemMessage(hDlg, IDCV_ICON, STM_GETICON, 0, 0L);
|
||
|
||
// the combined length of the 2 label lines won't ever be more than
|
||
// OLEUI_CCHLABELMAX.
|
||
Index = (INT)SendDlgItemMessage(hDlg, IDCV_ICONLABEL1,
|
||
WM_GETTEXT, OLEUI_CCHLABELMAX, (LPARAM)szLabel);
|
||
|
||
if (Index < OLEUI_CCHLABELMAX)
|
||
{
|
||
LPTSTR lpszSecondLine = szLabel + Index;
|
||
|
||
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_GETTEXT,
|
||
OLEUI_CCHLABELMAX-Index,
|
||
(LPARAM)lpszSecondLine);
|
||
}
|
||
|
||
#ifdef OLE201
|
||
lpCV->lpOCV->hMetaPict =
|
||
OleUIMetafilePictFromIconAndLabel(hIcon,
|
||
(LPTSTR)szLabel,
|
||
lpCV->lpszIconSource,
|
||
lpCV->IconIndex);
|
||
#endif
|
||
|
||
}
|
||
else
|
||
lpCV->lpOCV->hMetaPict = (HGLOBAL)NULL;
|
||
|
||
|
||
//
|
||
// End the dialog
|
||
//
|
||
SendMessage(hDlg, uMsgEndDialog, OLEUI_OK, 0L);
|
||
}
|
||
break;
|
||
|
||
case IDCANCEL:
|
||
SendMessage(hDlg, uMsgEndDialog, OLEUI_CANCEL, 0L);
|
||
break;
|
||
|
||
|
||
case ID_OLEUIHELP:
|
||
PostMessage(lpCV->lpOCV->hWndOwner,
|
||
uMsgHelp, (WPARAM)hDlg, MAKELPARAM(IDD_CONVERT, 0));
|
||
break;
|
||
|
||
case IDCV_DISPLAYASICON:
|
||
{
|
||
|
||
int i;
|
||
BOOL fCheck;
|
||
|
||
fCheck=IsDlgButtonChecked(hDlg, wID);
|
||
|
||
if (fCheck)
|
||
lpCV->dvAspect = DVASPECT_ICON;
|
||
else
|
||
lpCV->dvAspect = DVASPECT_CONTENT;
|
||
|
||
if (fCheck && (!lpCV->fCustomIcon))
|
||
UpdateCVClassIcon(hDlg, lpCV, lpCV->hListVisible);
|
||
|
||
//Show or hide the icon depending on the check state.
|
||
|
||
i=(fCheck) ? SW_SHOWNORMAL : SW_HIDE;
|
||
|
||
StandardShowDlgItem(hDlg, IDCV_CHANGEICON, i);
|
||
StandardShowDlgItem(hDlg, IDCV_ICON, i);
|
||
StandardShowDlgItem(hDlg, IDCV_ICONLABEL1, i);
|
||
StandardShowDlgItem(hDlg, IDCV_ICONLABEL2, i);
|
||
|
||
SetConvertResults(hDlg, lpCV);
|
||
|
||
}
|
||
break;
|
||
|
||
case IDCV_CHANGEICON:
|
||
{
|
||
LPMALLOC pIMalloc;
|
||
LPTSTR pszString, pszCLSID;
|
||
INT iSel;
|
||
HICON hIcon;
|
||
TCHAR szLabel[OLEUI_CCHLABELMAX];
|
||
INT Index;
|
||
|
||
|
||
//Initialize the structure for the hook.
|
||
_fmemset((LPOLEUICHANGEICON)&ci, 0, sizeof(ci));
|
||
|
||
// Create the hMetaPict here from icon, label,
|
||
// index, and path
|
||
|
||
hIcon = (HICON)SendDlgItemMessage(hDlg, IDCV_ICON, STM_GETICON, 0, 0L);
|
||
|
||
// the combined length of the 2 label lines won't ever be more than
|
||
// OLEUI_CCHLABELMAX.
|
||
|
||
Index = (INT)SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, WM_GETTEXT,
|
||
OLEUI_CCHLABELMAX, (LPARAM)szLabel);
|
||
|
||
if (Index < OLEUI_CCHLABELMAX)
|
||
{
|
||
LPTSTR lpszSecondLine;
|
||
|
||
lpszSecondLine = szLabel + Index;
|
||
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_GETTEXT,
|
||
OLEUI_CCHLABELMAX-Index,
|
||
(LPARAM)lpszSecondLine);
|
||
}
|
||
|
||
#ifdef OLE201
|
||
ci.hMetaPict =
|
||
OleUIMetafilePictFromIconAndLabel(hIcon,
|
||
szLabel,
|
||
lpCV->lpszIconSource,
|
||
lpCV->IconIndex);
|
||
#endif
|
||
|
||
ci.cbStruct =sizeof(ci);
|
||
ci.hWndOwner=hDlg;
|
||
ci.dwFlags = CIF_SELECTCURRENT;
|
||
|
||
// Only show help if we're showing it for this dialog.
|
||
if (lpCV->dwFlags & CF_SHOWHELPBUTTON)
|
||
ci.dwFlags |= CIF_SHOWHELP;
|
||
|
||
iSel = (INT)SendMessage(lpCV->hListVisible, LB_GETCURSEL, 0, 0L);
|
||
|
||
CoGetMalloc(MEMCTX_TASK, &pIMalloc);
|
||
|
||
pszString = (LPTSTR)pIMalloc->lpVtbl->Alloc(pIMalloc,
|
||
OLEUI_CCHLABELMAX_SIZE +
|
||
OLEUI_CCHCLSIDSTRING_SIZE);
|
||
|
||
// Get whole string
|
||
SendMessage(lpCV->hListVisible, LB_GETTEXT, iSel, (LONG)pszString);
|
||
|
||
// Set pointer to CLSID (string)
|
||
pszCLSID = PointerToNthField(pszString, 2, TEXT('\t'));
|
||
|
||
// Get the clsid to pass to change icon.
|
||
CLSIDFromStringA(pszCLSID, &(ci.clsid));
|
||
|
||
pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszString);
|
||
pIMalloc->lpVtbl->Release(pIMalloc);
|
||
|
||
//Let the hook in to customize Change Icon if desired.
|
||
uRet=UStandardHook(lpCV, hDlg, uMsgChangeIcon
|
||
, 0, (LONG)(LPTSTR)&ci);
|
||
|
||
if (0==uRet)
|
||
uRet=(UINT)(OLEUI_OK==OleUIChangeIcon((LPOLEUICHANGEICON)&ci));
|
||
|
||
//Update the display if necessary.
|
||
if (0!=uRet)
|
||
{
|
||
HICON hIcon;
|
||
TCHAR szLabel[OLEUI_CCHLABELMAX];
|
||
DWORD dwWrapIndex;
|
||
|
||
|
||
hIcon = OleUIMetafilePictExtractIcon(ci.hMetaPict);
|
||
|
||
SendDlgItemMessage(hDlg, IDCV_ICON, STM_SETICON, (WPARAM)hIcon, 0L);
|
||
|
||
OleUIMetafilePictExtractIconSource(ci.hMetaPict, lpCV->lpszIconSource, &(lpCV->IconIndex));
|
||
|
||
OleUIMetafilePictExtractLabel(ci.hMetaPict, szLabel, OLEUI_CCHLABELMAX, &dwWrapIndex);
|
||
|
||
if (0 == dwWrapIndex) // no second line
|
||
{
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, WM_SETTEXT, 0, (LPARAM)(LPTSTR)szLabel);
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_SETTEXT, 0, (LPARAM)(LPTSTR)TEXT(""));
|
||
}
|
||
else
|
||
{
|
||
|
||
LPTSTR lpszSecondLine;
|
||
|
||
lpszSecondLine = szLabel + dwWrapIndex;
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL2,
|
||
WM_SETTEXT, 0, (LPARAM)lpszSecondLine);
|
||
|
||
*lpszSecondLine = TEXT('\0');
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL1,
|
||
WM_SETTEXT, 0, (LPARAM)(LPTSTR)szLabel);
|
||
}
|
||
|
||
|
||
// Update our custom/default flag
|
||
|
||
if (ci.dwFlags & CIF_SELECTDEFAULT)
|
||
lpCV->fCustomIcon = FALSE; // we're in default mode (icon changes on each LB selchange)
|
||
else if (ci.dwFlags & CIF_SELECTFROMFILE)
|
||
lpCV->fCustomIcon = TRUE; // we're in custom mode (icon doesn't change)
|
||
// no change in fCustomIcon if user selected current
|
||
|
||
|
||
lpCV->lpOCV->fObjectsIconChanged = TRUE;
|
||
}
|
||
}
|
||
break;
|
||
|
||
}
|
||
break;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/*
|
||
* FConvertInit
|
||
*
|
||
* Purpose:
|
||
* WM_INITIDIALOG handler for the Convert dialog box.
|
||
*
|
||
* Parameters:
|
||
* hDlg HWND of the dialog
|
||
* wParam WPARAM of the message
|
||
* lParam LPARAM of the message
|
||
*
|
||
* Return Value:
|
||
* BOOL Value to return for WM_INITDIALOG.
|
||
*/
|
||
|
||
BOOL FConvertInit(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
LPCONVERT lpCV;
|
||
LPOLEUICONVERT lpOCV;
|
||
LPMALLOC pIMalloc;
|
||
HFONT hFont; // non-bold version of dialog's font
|
||
RECT rc;
|
||
DWORD dw;
|
||
INT cItemsActivate;
|
||
HKEY hKey;
|
||
LONG lRet;
|
||
UINT nRet;
|
||
|
||
|
||
//Copy the structure at lParam into our instance memory.
|
||
lpCV=(LPCONVERT)LpvStandardInit(hDlg, sizeof(CONVERT), TRUE, (HFONT FAR *)&hFont);
|
||
|
||
//PvStandardInit send a termination to us already.
|
||
if (NULL==lpCV)
|
||
return FALSE;
|
||
|
||
lpOCV=(LPOLEUICONVERT)lParam;
|
||
|
||
lpCV->lpOCV=lpOCV;
|
||
|
||
lpCV->fCustomIcon = FALSE;
|
||
|
||
//Copy other information from lpOCV that we might modify.
|
||
lpCV->dwFlags = lpOCV->dwFlags;
|
||
lpCV->clsid = lpOCV->clsid;
|
||
lpCV->dvAspect = lpOCV->dvAspect;
|
||
lpCV->hListVisible = GetDlgItem(hDlg, IDCV_ACTIVATELIST);
|
||
lpCV->hListInvisible = GetDlgItem(hDlg, IDCV_CONVERTLIST);
|
||
lpCV->lpszCurrentObject = lpOCV->lpszUserType;
|
||
|
||
lpOCV->clsidNew = CLSID_NULL;
|
||
|
||
lpOCV->fObjectsIconChanged = FALSE;
|
||
|
||
//Allocate space for our strings
|
||
if (NOERROR != CoGetMalloc(MEMCTX_TASK, &pIMalloc))
|
||
return FALSE;
|
||
|
||
lpCV->lpszConvertDefault = (LPTSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHLABELMAX_SIZE);
|
||
lpCV->lpszActivateDefault = (LPTSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHLABELMAX_SIZE);
|
||
lpCV->lpszIconSource = (LPTSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHPATHMAX_SIZE);
|
||
pIMalloc->lpVtbl->Release(pIMalloc);
|
||
|
||
//If we got a font, send it to the necessary controls.
|
||
if (NULL!=hFont)
|
||
{
|
||
SendDlgItemMessage(hDlg, IDCV_OBJECTTYPE, WM_SETFONT, (WPARAM)hFont, 0L);
|
||
SendDlgItemMessage(hDlg, IDCV_RESULTTEXT, WM_SETFONT, (WPARAM)hFont, 0L);
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, WM_SETFONT, (WPARAM)hFont, 0L);
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_SETFONT, (WPARAM)hFont, 0L);
|
||
}
|
||
|
||
//Hide the help button if necessary
|
||
if (!(lpCV->dwFlags & CF_SHOWHELPBUTTON))
|
||
StandardShowDlgItem(hDlg, ID_OLEUIHELP, SW_HIDE);
|
||
|
||
//Fill the Object Type listbox with entries from the reg DB.
|
||
nRet = FillClassList(lpOCV->clsid,
|
||
lpCV->hListVisible,
|
||
lpCV->hListInvisible,
|
||
&(lpCV->lpszCurrentObject),
|
||
lpOCV->fIsLinkedObject,
|
||
lpOCV->wFormat,
|
||
lpOCV->cClsidExclude,
|
||
lpOCV->lpClsidExclude);
|
||
|
||
if (nRet == -1) {
|
||
// bring down dialog if error when filling list box
|
||
PostMessage(hDlg, uMsgEndDialog, OLEUI_ERR_LOADSTRING, 0L);
|
||
}
|
||
|
||
// Set the name of the current object.
|
||
SetDlgItemText(hDlg, IDCV_OBJECTTYPE, (LPTSTR)lpCV->lpszCurrentObject);
|
||
|
||
// Disable the "Activate As" button if the Activate list doesn't
|
||
// have any objects in it.
|
||
|
||
cItemsActivate = (INT)SendMessage(lpCV->hListVisible, LB_GETCOUNT, 0, 0L);
|
||
|
||
if (1 >= cItemsActivate || (lpCV->dwFlags & CF_DISABLEACTIVATEAS))
|
||
EnableWindow(GetDlgItem(hDlg, IDCV_ACTIVATEAS), FALSE);
|
||
|
||
//Set the tab width in the list to push all the tabs off the side.
|
||
GetClientRect(lpCV->hListVisible, (LPRECT)&rc);
|
||
dw=GetDialogBaseUnits();
|
||
rc.right =(8*rc.right)/LOWORD(dw); //Convert pixels to 2x dlg units.
|
||
SendMessage(lpCV->hListVisible, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)(&rc.right));
|
||
SendMessage(lpCV->hListInvisible, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)(&rc.right));
|
||
|
||
|
||
// Make sure that either "Convert To" or "Activate As" is selected
|
||
// and initialize listbox contents and selection accordingly
|
||
if (lpCV->dwFlags & CF_SELECTACTIVATEAS)
|
||
{
|
||
// Don't need to adjust listbox here because FillClassList
|
||
// initializes to the "Activate As" state.
|
||
CheckRadioButton(hDlg, IDCV_CONVERTTO, IDCV_ACTIVATEAS, IDCV_ACTIVATEAS);
|
||
|
||
// Hide the icon stuff when Activate is selected...it gets shown
|
||
// again when Convert is selected.
|
||
|
||
StandardShowDlgItem(hDlg, IDCV_DISPLAYASICON, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_CHANGEICON, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_ICON, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_ICONLABEL1, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_ICONLABEL2, SW_HIDE);
|
||
}
|
||
else
|
||
{
|
||
// Default case. If user hasn't selected either flag, we will
|
||
// come here anyway.
|
||
// swap listboxes.
|
||
|
||
HWND hWndTemp = lpCV->hListVisible;
|
||
|
||
if ( lpCV->dwFlags & CF_DISABLEDISPLAYASICON ) {
|
||
StandardShowDlgItem(hDlg, IDCV_DISPLAYASICON, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_CHANGEICON, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_ICON, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_ICONLABEL1, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_ICONLABEL2, SW_HIDE);
|
||
}
|
||
|
||
lpCV->dwFlags |= CF_SELECTCONVERTTO; // Make sure flag is set
|
||
CheckRadioButton(hDlg, IDCV_CONVERTTO, IDCV_ACTIVATEAS, IDCV_CONVERTTO);
|
||
|
||
SwapWindows(hDlg, lpCV->hListVisible, lpCV->hListInvisible);
|
||
|
||
lpCV->hListVisible = lpCV->hListInvisible;
|
||
lpCV->hListInvisible = hWndTemp;
|
||
|
||
EnableWindow(lpCV->hListInvisible, FALSE);
|
||
EnableWindow(lpCV->hListVisible, TRUE);
|
||
}
|
||
|
||
|
||
|
||
// Initialize Default strings.
|
||
|
||
// Default convert string is easy...just user the user type name from
|
||
// the clsid we got, or the current object
|
||
if ( (lpCV->dwFlags & CF_SETCONVERTDEFAULT)
|
||
&& (IsValidClassID(lpCV->lpOCV->clsidConvertDefault)) )
|
||
{
|
||
dw = OleStdGetUserTypeOfClass((LPCLSID)(&lpCV->lpOCV->clsidConvertDefault),
|
||
lpCV->lpszConvertDefault,
|
||
OLEUI_CCHLABELMAX_SIZE,
|
||
NULL);
|
||
|
||
if (0 == dw)
|
||
lstrcpy((LPTSTR)lpCV->lpszConvertDefault, (LPTSTR)lpCV->lpszCurrentObject);
|
||
}
|
||
else
|
||
lstrcpy((LPTSTR)lpCV->lpszConvertDefault, (LPTSTR)lpCV->lpszCurrentObject);
|
||
|
||
|
||
// Default activate is a bit trickier. We want to use the user type
|
||
// name if from the clsid we got (assuming we got one), or the current
|
||
// object if it fails or we didn't get a clsid. But...if there's a
|
||
// Treat As entry in the reg db, then we use that instead. So... the
|
||
// logic boils down to this:
|
||
//
|
||
// if ("Treat As" in reg db)
|
||
// use it;
|
||
// else
|
||
// if (CF_SETACTIVATEDEFAULT)
|
||
// use it;
|
||
// else
|
||
// use current object;
|
||
|
||
|
||
|
||
lRet = RegOpenKey(HKEY_CLASSES_ROOT, TEXT("CLSID"), (HKEY FAR *)&hKey);
|
||
|
||
if (lRet != ERROR_SUCCESS)
|
||
goto CheckInputFlag;
|
||
|
||
else
|
||
{
|
||
LPTSTR lpszCLSID;
|
||
TCHAR szKey[OLEUI_CCHKEYMAX];
|
||
CLSID clsid;
|
||
TCHAR szValue[OLEUI_CCHKEYMAX];
|
||
|
||
StringFromCLSIDA(&(lpCV->lpOCV->clsid), &lpszCLSID);
|
||
lstrcpy(szKey, lpszCLSID);
|
||
lstrcat(szKey, TEXT("\\TreatAs"));
|
||
|
||
dw = OLEUI_CCHKEYMAX_SIZE;
|
||
lRet = RegQueryValue(hKey, (LPTSTR)szKey, (LPTSTR)szValue, (LPDWORD)&dw);
|
||
|
||
if (lRet != ERROR_SUCCESS)
|
||
{
|
||
|
||
RegCloseKey(hKey);
|
||
OleStdFreeString(lpszCLSID, NULL);
|
||
goto CheckInputFlag;
|
||
}
|
||
else
|
||
{
|
||
CLSIDFromStringA(szValue, &clsid);
|
||
|
||
if (0 == OleStdGetUserTypeOfClass(&clsid,
|
||
lpCV->lpszActivateDefault,
|
||
OLEUI_CCHLABELMAX_SIZE,
|
||
NULL))
|
||
{
|
||
RegCloseKey(hKey);
|
||
OleStdFreeString(lpszCLSID, NULL);
|
||
goto CheckInputFlag;
|
||
}
|
||
}
|
||
RegCloseKey(hKey);
|
||
OleStdFreeString(lpszCLSID, NULL);
|
||
goto SelectStringInListbox;
|
||
}
|
||
|
||
|
||
CheckInputFlag:
|
||
if ( (lpCV->dwFlags & CF_SETACTIVATEDEFAULT)
|
||
&& (IsValidClassID(lpCV->lpOCV->clsidActivateDefault)) )
|
||
{
|
||
dw = OleStdGetUserTypeOfClass((LPCLSID)(&lpCV->lpOCV->clsidActivateDefault),
|
||
lpCV->lpszActivateDefault,
|
||
OLEUI_CCHLABELMAX_SIZE,
|
||
NULL);
|
||
|
||
if (0 == dw)
|
||
lstrcpy((LPTSTR)lpCV->lpszActivateDefault, (LPTSTR)lpCV->lpszCurrentObject);
|
||
}
|
||
else
|
||
lstrcpy((LPTSTR)(lpCV->lpszActivateDefault), (LPTSTR)lpCV->lpszCurrentObject);
|
||
|
||
|
||
SelectStringInListbox:
|
||
|
||
if (lpCV->dwFlags & CF_SELECTCONVERTTO)
|
||
lRet = SendMessage(lpCV->hListVisible, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)(LPTSTR)(lpCV->lpszConvertDefault));
|
||
|
||
else
|
||
lRet = SendMessage(lpCV->hListVisible, LB_SELECTSTRING, (WPARAM)-1, (LPARAM)(LPTSTR)(lpCV->lpszActivateDefault));
|
||
|
||
if (LB_ERR == lRet)
|
||
SendMessage(lpCV->hListVisible, LB_SETCURSEL, (WPARAM)0, 0L);
|
||
|
||
|
||
// Initialize icon stuff
|
||
if (DVASPECT_ICON == lpCV->dvAspect )
|
||
{
|
||
SendDlgItemMessage(hDlg, IDCV_DISPLAYASICON, BM_SETCHECK, TRUE, 0L);
|
||
|
||
if ((HGLOBAL)NULL != lpOCV->hMetaPict)
|
||
{
|
||
TCHAR szLabel[OLEUI_CCHLABELMAX];
|
||
HICON hIcon;
|
||
DWORD dwWrapIndex;
|
||
|
||
|
||
// Set the icon to the icon from the hMetaPict,
|
||
// set the label to the label from the hMetaPict.
|
||
|
||
if (0 != OleUIMetafilePictExtractLabel(lpOCV->hMetaPict, (LPTSTR)szLabel, OLEUI_CCHLABELMAX_SIZE, &dwWrapIndex))
|
||
{
|
||
if (0 == dwWrapIndex) // no second line
|
||
{
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL1, WM_SETTEXT, 0, (LPARAM)(LPTSTR)szLabel);
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_SETTEXT, 0, (LPARAM)(LPTSTR)TEXT(""));
|
||
}
|
||
else
|
||
{
|
||
|
||
LPTSTR lpszSecondLine;
|
||
|
||
lpszSecondLine = szLabel + dwWrapIndex;
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL2,
|
||
WM_SETTEXT, 0, (LPARAM)lpszSecondLine);
|
||
|
||
*lpszSecondLine = TEXT('\0');
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL1,
|
||
WM_SETTEXT, 0, (LPARAM)(LPTSTR)szLabel);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
hIcon = OleUIMetafilePictExtractIcon(lpOCV->hMetaPict);
|
||
|
||
if (NULL != hIcon)
|
||
{
|
||
SendDlgItemMessage(hDlg, IDCV_ICON, STM_SETICON, (WPARAM)hIcon, 0L);
|
||
lpCV->fCustomIcon = TRUE;
|
||
}
|
||
|
||
OleUIMetafilePictExtractIconSource(lpOCV->hMetaPict,
|
||
(LPTSTR)(lpCV->lpszIconSource),
|
||
&(lpCV->IconIndex));
|
||
|
||
}
|
||
else
|
||
UpdateCVClassIcon(hDlg, lpCV, lpCV->hListVisible);
|
||
}
|
||
else
|
||
{
|
||
// Hide & disable icon stuff
|
||
StandardShowDlgItem(hDlg, IDCV_ICON, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_ICONLABEL1, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_ICONLABEL2, SW_HIDE);
|
||
StandardShowDlgItem(hDlg, IDCV_CHANGEICON, SW_HIDE);
|
||
}
|
||
|
||
// Call the hook with lCustData in lParam
|
||
UStandardHook((LPVOID)lpCV, hDlg, WM_INITDIALOG, wParam, lpOCV->lCustData);
|
||
// Update results window
|
||
SetConvertResults(hDlg, lpCV);
|
||
|
||
// Update caption if lpszCaption was specified
|
||
if (lpCV->lpOCV->lpszCaption && !IsBadReadPtr(lpCV->lpOCV->lpszCaption, 1)
|
||
&& lpCV->lpOCV->lpszCaption[0] != '\0')
|
||
SetWindowText(hDlg, (LPTSTR)lpCV->lpOCV->lpszCaption);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*
|
||
* FillClassList
|
||
*
|
||
* Purpose:
|
||
* Enumerates available OLE object classes from the registration
|
||
* database that we can convert or activate the specified clsid from.
|
||
*
|
||
* Note that this function removes any prior contents of the listbox.
|
||
*
|
||
* Parameters:
|
||
* clsid Class ID for class to find convert classes for
|
||
* hList HWND to the listbox to fill.
|
||
* hListActivate HWND to invisible listbox that stores "activate as" list.
|
||
* lpszClassName LPSTR to put the (hr) class name of the clsid; we
|
||
* do it here since we've already got the reg db open.
|
||
* fIsLinkedObject BOOL is the original object a linked object
|
||
* wFormat WORD specifying the format of the original class.
|
||
* cClsidExclude UINT number of entries in exclude list
|
||
* lpClsidExclude LPCLSID array classes to exclude for list
|
||
*
|
||
* Return Value:
|
||
* UINT Number of strings added to the listbox, -1 on failure.
|
||
*/
|
||
|
||
UINT FillClassList(
|
||
CLSID clsid,
|
||
HWND hList,
|
||
HWND hListInvisible,
|
||
LPTSTR FAR *lplpszCurrentClass,
|
||
BOOL fIsLinkedObject,
|
||
WORD wFormat,
|
||
UINT cClsidExclude,
|
||
LPCLSID lpClsidExclude)
|
||
{
|
||
|
||
DWORD dw;
|
||
UINT cStrings=0;
|
||
HKEY hKey;
|
||
LONG lRet;
|
||
TCHAR szFormatKey[OLEUI_CCHKEYMAX];
|
||
TCHAR szClass[OLEUI_CCHKEYMAX];
|
||
TCHAR szFormat[OLEUI_CCHKEYMAX];
|
||
TCHAR szHRClassName[OLEUI_CCHKEYMAX];
|
||
CLSID clsidForList;
|
||
|
||
LPTSTR lpszCLSID;
|
||
|
||
|
||
//Clean out the existing strings.
|
||
SendMessage(hList, LB_RESETCONTENT, 0, 0L);
|
||
SendMessage(hListInvisible, LB_RESETCONTENT, 0, 0L);
|
||
|
||
//Open up the root key.
|
||
lRet=RegOpenKey(HKEY_CLASSES_ROOT, (LPCTSTR) TEXT("CLSID"), (HKEY FAR *)&hKey);
|
||
|
||
if ((LONG)ERROR_SUCCESS!=lRet)
|
||
return (UINT)-1;
|
||
|
||
if (NULL == *lplpszCurrentClass)
|
||
{
|
||
// alloc buffer here...
|
||
|
||
LPMALLOC pIMalloc = NULL;
|
||
HRESULT hrErr;
|
||
|
||
|
||
hrErr = CoGetMalloc(MEMCTX_TASK, &pIMalloc);
|
||
|
||
if (hrErr != NOERROR)
|
||
{
|
||
RegCloseKey(hKey);
|
||
return FALSE;
|
||
}
|
||
|
||
// Allocate space for lpszCurrentClass
|
||
*lplpszCurrentClass = (LPTSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHKEYMAX_SIZE);
|
||
pIMalloc->lpVtbl->Release(pIMalloc);
|
||
|
||
lRet = OleStdGetUserTypeOfClass((REFCLSID)&clsid,
|
||
*lplpszCurrentClass,
|
||
OLEUI_CCHLABELMAX_SIZE,
|
||
NULL);
|
||
|
||
if (0 ==lRet)
|
||
{
|
||
INT n = LoadString(ghInst, IDS_PSUNKNOWNTYPE, *lplpszCurrentClass,
|
||
OLEUI_CCHKEYMAX);
|
||
if (!n)
|
||
{
|
||
OutputDebugString(TEXT("Cannot LoadString\n"));
|
||
RegCloseKey(hKey);
|
||
return (UINT)-1;
|
||
}
|
||
}
|
||
}
|
||
|
||
// Get the class name of the original class.
|
||
StringFromCLSIDA(&clsid, &lpszCLSID);
|
||
|
||
|
||
// Here, we step through the entire registration db looking for
|
||
// class that can read or write the original class' format. We
|
||
// maintain two lists - an activate list and a convert list. The
|
||
// activate list is a subset of the convert list - activate == read/write
|
||
// and convert == read. We swap the listboxes as needed with
|
||
// SwapWindows, and keep track of which is which in the lpCV structure.
|
||
|
||
// Every item has the following format:
|
||
//
|
||
// Class Name\tclsid\0
|
||
|
||
|
||
cStrings=0;
|
||
lRet=RegEnumKey(hKey, cStrings++, szClass, OLEUI_CCHKEYMAX_SIZE);
|
||
|
||
while ((LONG)ERROR_SUCCESS==lRet)
|
||
{
|
||
INT j;
|
||
BOOL fExclude=FALSE;
|
||
|
||
|
||
//Check if this CLSID is in the exclusion list.
|
||
CLSIDFromStringA(szClass, &clsidForList);
|
||
|
||
for (j=0; j < (int)cClsidExclude; j++)
|
||
{
|
||
if (IsEqualCLSID(&clsidForList, (LPCLSID)(lpClsidExclude+j)))
|
||
{
|
||
fExclude=TRUE;
|
||
break;
|
||
}
|
||
}
|
||
if (fExclude)
|
||
goto Next; // don't add this class to list
|
||
|
||
// Check for a \Conversion\Readwritable\Main - if its
|
||
// readwriteable, then the class can be added to the ActivateAs
|
||
// list.
|
||
// NOTE: the presence of this key should NOT automatically be
|
||
// used to add the class to the CONVERT list.
|
||
|
||
lstrcpy((LPTSTR)szFormatKey, (LPTSTR)szClass);
|
||
lstrcat((LPTSTR)szFormatKey, (LPTSTR) TEXT("\\Conversion\\Readwritable\\Main"));
|
||
|
||
dw=OLEUI_CCHKEYMAX_SIZE;
|
||
|
||
lRet=RegQueryValue(hKey, (LPTSTR)szFormatKey, (LPTSTR)szFormat, (LONG FAR *)&dw);
|
||
|
||
if ( ((LONG)ERROR_SUCCESS==lRet)
|
||
&& (FormatIncluded((LPTSTR)szFormat, wFormat)) )
|
||
{
|
||
// Here, we've got a list of formats that this class can read
|
||
// and write. We need to see if the original class' format is
|
||
// in this list. We do that by looking for wFormat in
|
||
// szFormat - if it in there, then we add this class to the
|
||
// ACTIVATEAS list only. we do NOT automatically add it to the
|
||
// CONVERT list. Readable and Readwritable format lists should
|
||
// be handled separately.
|
||
|
||
dw=OLEUI_CCHKEYMAX_SIZE;
|
||
lRet=RegQueryValue(hKey, (LPTSTR)szClass, (LPTSTR)szHRClassName, (LPDWORD)&dw);
|
||
|
||
if ((LONG)ERROR_SUCCESS==lRet)
|
||
{
|
||
lstrcat((LPTSTR)szHRClassName, (LPTSTR) TEXT("\t"));
|
||
|
||
// only add if not already in list
|
||
if (LB_ERR==SendMessage(hList,LB_FINDSTRING, 0,
|
||
(LPARAM)(LPSTR)szHRClassName)) {
|
||
lstrcat((LPTSTR)szHRClassName, (LPTSTR)szClass);
|
||
SendMessage(hList, LB_ADDSTRING, 0,
|
||
(DWORD)(LPTSTR)szHRClassName);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
// Here we'll check to see if the original class' format is in the
|
||
// readable list. if so, we will add the class to the CONVERTLIST
|
||
|
||
|
||
// We've got a special case for a linked object here.
|
||
// If an object is linked, then the only class that
|
||
// should appear in the convert list is the object's
|
||
// class. So, here we check to see if the object is
|
||
// linked. If it is, then we compare the classes. If
|
||
// they aren't the same, then we just go to the next key.
|
||
|
||
if ( (!fIsLinkedObject)||(lstrcmp((LPCTSTR)lpszCLSID, szClass) == 0))
|
||
{
|
||
|
||
//Check for a \Conversion\Readable\Main entry
|
||
lstrcpy((LPTSTR)szFormatKey, (LPTSTR)szClass);
|
||
lstrcat((LPTSTR)szFormatKey, (LPTSTR) TEXT("\\Conversion\\Readable\\Main"));
|
||
|
||
dw=OLEUI_CCHKEYMAX_SIZE;
|
||
|
||
// Check to see if this class can read the original class
|
||
// format. If it can, add the string to the listbox as
|
||
// CONVERT_LIST.
|
||
|
||
lRet=RegQueryValue(hKey, (LPCTSTR)szFormatKey, (LPTSTR)szFormat, (LPDWORD)&dw);
|
||
|
||
if ( ((LONG)ERROR_SUCCESS==lRet)
|
||
&& (FormatIncluded((LPTSTR)szFormat, wFormat)) )
|
||
{
|
||
|
||
|
||
dw=OLEUI_CCHKEYMAX_SIZE;
|
||
lRet=RegQueryValue(hKey, (LPCTSTR)szClass, (LPTSTR)szHRClassName, (LPDWORD)&dw);
|
||
|
||
if ((LONG)ERROR_SUCCESS==lRet)
|
||
{
|
||
lstrcat((LPTSTR)szHRClassName, (LPTSTR) TEXT("\t"));
|
||
|
||
// only add if not already in list
|
||
if (LB_ERR==SendMessage(hListInvisible,LB_FINDSTRING, 0,
|
||
(LPARAM)(LPSTR)szHRClassName)) {
|
||
lstrcat((LPTSTR)szHRClassName, szClass);
|
||
SendMessage(hListInvisible, LB_ADDSTRING, 0,
|
||
(DWORD)(LPTSTR)szHRClassName);
|
||
}
|
||
} // end if
|
||
|
||
} // end if
|
||
} // end else
|
||
Next:
|
||
//Continue with the next key.
|
||
lRet=RegEnumKey(hKey, cStrings++, (LPTSTR)szClass, OLEUI_CCHKEYMAX_SIZE);
|
||
|
||
} // end while
|
||
|
||
// If the original class isn't already in the list, add it.
|
||
|
||
lstrcpy((LPTSTR)szHRClassName, *lplpszCurrentClass);
|
||
lstrcat((LPTSTR)szHRClassName, (LPTSTR) TEXT("\t"));
|
||
|
||
lRet = SendMessage(hList, LB_FINDSTRING, (WPARAM)-1, (LPARAM)(LPTSTR)szHRClassName);
|
||
|
||
// only add it if it's not there already.
|
||
if (LB_ERR == lRet) {
|
||
lstrcat((LPTSTR)szHRClassName, lpszCLSID);
|
||
SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szHRClassName);
|
||
}
|
||
|
||
lRet = SendMessage(hListInvisible, LB_FINDSTRING, (WPARAM)-1, (LPARAM)(LPTSTR)szHRClassName);
|
||
|
||
// only add it if it's not there already.
|
||
if (LB_ERR == lRet)
|
||
SendMessage(hListInvisible, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szHRClassName);
|
||
|
||
// Free the string we got from StringFromCLSID.
|
||
// OLE2NOTE: StringFromCLSID uses your IMalloc to alloc a
|
||
// string, so you need to be sure to free the string you
|
||
// get back, otherwise you'll have leaky memory.
|
||
|
||
OleStdFreeString(lpszCLSID, NULL);
|
||
|
||
RegCloseKey(hKey);
|
||
|
||
return cStrings;
|
||
}
|
||
|
||
|
||
/*
|
||
* OleUICanConvertOrActivateAs
|
||
*
|
||
* Purpose:
|
||
* Determine if there is any OLE object class from the registration
|
||
* database that we can convert or activate the specified clsid from.
|
||
*
|
||
* Parameters:
|
||
* rClsid REFCLSID Class ID for class to find convert classes for
|
||
* fIsLinkedObject BOOL is the original object a linked object
|
||
* wFormat WORD specifying the format of the original class.
|
||
*
|
||
* Return Value:
|
||
* BOOL TRUE if Convert command should be enabled, else FALSE
|
||
*/
|
||
|
||
STDAPI_(BOOL) OleUICanConvertOrActivateAs(
|
||
REFCLSID rClsid,
|
||
BOOL fIsLinkedObject,
|
||
WORD wFormat
|
||
)
|
||
{
|
||
|
||
DWORD dw;
|
||
UINT cStrings=0;
|
||
HKEY hKey;
|
||
LONG lRet;
|
||
TCHAR szFormatKey[OLEUI_CCHKEYMAX];
|
||
TCHAR szClass[OLEUI_CCHKEYMAX];
|
||
TCHAR szFormat[OLEUI_CCHKEYMAX];
|
||
TCHAR szHRClassName[OLEUI_CCHKEYMAX];
|
||
BOOL fEnableConvert = FALSE;
|
||
|
||
LPTSTR lpszCLSID;
|
||
|
||
//Open up the root key.
|
||
lRet=RegOpenKey(HKEY_CLASSES_ROOT, "CLSID", (HKEY FAR *)&hKey);
|
||
|
||
if ((LONG)ERROR_SUCCESS!=lRet)
|
||
return FALSE;
|
||
|
||
// Get the class name of the original class.
|
||
StringFromCLSIDA(rClsid, &lpszCLSID);
|
||
|
||
// Here, we step through the entire registration db looking for
|
||
// class that can read or write the original class' format.
|
||
// This loop stops if a single class is found.
|
||
|
||
cStrings=0;
|
||
lRet=RegEnumKey(hKey, cStrings++, szClass, OLEUI_CCHKEYMAX_SIZE);
|
||
|
||
while ((LONG)ERROR_SUCCESS==lRet)
|
||
{
|
||
if (lstrcmp(lpszCLSID, szClass)== 0)
|
||
goto next; // we don't want to consider the source class
|
||
|
||
// Check for a \Conversion\ReadWriteable\Main entry first - if its
|
||
// readwriteable, then we don't need to bother checking to see if
|
||
// its readable.
|
||
|
||
lstrcpy((LPTSTR)szFormatKey, (LPTSTR)szClass);
|
||
lstrcat((LPTSTR)szFormatKey, (LPTSTR) TEXT("\\Conversion\\Readwritable\\Main"));
|
||
|
||
dw=OLEUI_CCHKEYMAX_SIZE;
|
||
|
||
lRet=RegQueryValue(hKey, (LPCTSTR)szFormatKey, (LPTSTR)szFormat, (LONG FAR *)&dw);
|
||
|
||
if ( (LONG)ERROR_SUCCESS != lRet)
|
||
{
|
||
// Try \\DataFormats\DefaultFile too
|
||
|
||
lstrcpy((LPTSTR)szFormatKey, (LPTSTR)szClass);
|
||
lstrcat((LPTSTR)szFormatKey, (LPTSTR) TEXT("\\DataFormats\\DefaultFile"));
|
||
|
||
dw=OLEUI_CCHKEYMAX_SIZE;
|
||
|
||
lRet=RegQueryValue(hKey, (LPCTSTR)szFormatKey, (LPTSTR)szFormat, (LONG FAR *)&dw);
|
||
}
|
||
|
||
|
||
if ( ((LONG)ERROR_SUCCESS==lRet)
|
||
&& (FormatIncluded((LPTSTR)szFormat, wFormat)) )
|
||
{
|
||
|
||
// Here, we've got a list of formats that this class can read
|
||
// and write. We need to see if the original class' format is
|
||
// in this list. We do that by looking for wFormat in
|
||
// szFormat - if it in there, then we add this class to the
|
||
// both lists and continue. If not, then we look at the
|
||
// class' readable formats.
|
||
|
||
|
||
dw=OLEUI_CCHKEYMAX_SIZE;
|
||
lRet=RegQueryValue(hKey, (LPCTSTR)szClass, (LPTSTR)szHRClassName, (LPDWORD)&dw);
|
||
|
||
if ((LONG)ERROR_SUCCESS==lRet)
|
||
{
|
||
fEnableConvert = TRUE;
|
||
break; // STOP -- found one!
|
||
}
|
||
|
||
}
|
||
|
||
|
||
// We either didn't find the readwritable key, or the
|
||
// list of readwritable formats didn't include the
|
||
// original class format. So, here we'll check to
|
||
// see if its in the readable list.
|
||
|
||
|
||
// We've got a special case for a linked object here.
|
||
// If an object is linked, then the only class that
|
||
// should appear in the convert list is the object's
|
||
// class. So, here we check to see if the object is
|
||
// linked. If it is, then we compare the classes. If
|
||
// they aren't the same, then we just go to the next key.
|
||
|
||
else if ( (!fIsLinkedObject)||
|
||
(lstrcmp((LPTSTR)lpszCLSID, (LPTSTR)szClass)== 0))
|
||
{
|
||
|
||
//Check for a \Conversion\Readable\Main entry
|
||
lstrcpy((LPTSTR)szFormatKey, (LPTSTR)szClass);
|
||
lstrcat((LPTSTR)szFormatKey, (LPTSTR) TEXT("\\Conversion\\Readable\\Main"));
|
||
|
||
dw=OLEUI_CCHKEYMAX_SIZE;
|
||
|
||
// Check to see if this class can read the original class
|
||
// format. If it can, add the string to the listbox as
|
||
// CONVERT_LIST.
|
||
|
||
lRet=RegQueryValue(hKey, (LPTSTR)szFormatKey, (LPTSTR)szFormat, (LPDWORD)&dw);
|
||
|
||
if ( ((LONG)ERROR_SUCCESS==lRet)
|
||
&& (FormatIncluded((LPTSTR)szFormat, wFormat)) )
|
||
{
|
||
|
||
|
||
dw=OLEUI_CCHKEYMAX_SIZE;
|
||
lRet=RegQueryValue(hKey, (LPTSTR)szClass, (LPTSTR)szHRClassName, (LPDWORD)&dw);
|
||
|
||
if ((LONG)ERROR_SUCCESS==lRet)
|
||
{
|
||
|
||
fEnableConvert = TRUE;
|
||
break; // STOP -- found one!
|
||
} // end if
|
||
|
||
} // end if
|
||
} // end else
|
||
next:
|
||
//Continue with the next key.
|
||
lRet=RegEnumKey(hKey, cStrings++, (LPTSTR)szClass, OLEUI_CCHKEYMAX_SIZE);
|
||
|
||
} // end while
|
||
|
||
// Free the string we got from StringFromCLSID.
|
||
// OLE2NOTE: StringFromCLSID uses your IMalloc to alloc a
|
||
// string, so you need to be sure to free the string you
|
||
// get back, otherwise you'll have leaky memory.
|
||
|
||
OleStdFreeString(lpszCLSID, NULL);
|
||
|
||
RegCloseKey(hKey);
|
||
|
||
return fEnableConvert;
|
||
}
|
||
|
||
|
||
/*
|
||
* FormatIncluded
|
||
*
|
||
* Purpose:
|
||
* Parses the string for format from the word.
|
||
*
|
||
* Parameters:
|
||
* szStringToSearch String to parse
|
||
* wFormat format to find
|
||
*
|
||
* Return Value:
|
||
* BOOL TRUE if format is found in string,
|
||
* FALSE otherwise.
|
||
*/
|
||
BOOL FormatIncluded(LPTSTR szStringToSearch, WORD wFormat)
|
||
{
|
||
|
||
LPTSTR lpToken;
|
||
TCHAR seps[] = TEXT(",");
|
||
static TCHAR szFormat[255]; // max size of atom (what GetClipboardName returns)
|
||
|
||
|
||
if (wFormat < 0xC000) // RegisterClipboardFormat returns values
|
||
{
|
||
char szTemp[11];
|
||
|
||
_itoa(wFormat, szTemp, 10); // between 0xC000 and 0xFFFF.
|
||
|
||
#ifdef UNICODE
|
||
mbstowcs(szFormat, szTemp, 11);
|
||
#else
|
||
strncpy(szFormat, szTemp, 11);
|
||
#endif
|
||
|
||
}
|
||
|
||
else
|
||
GetClipboardFormatName(wFormat, szFormat, 255);
|
||
|
||
lpToken = (LPTSTR)_fstrtok(szStringToSearch, seps);
|
||
|
||
while (lpToken != NULL)
|
||
{
|
||
|
||
if (0 ==lstrcmpi(lpToken, szFormat))
|
||
return TRUE;
|
||
|
||
else
|
||
lpToken = (LPTSTR)_fstrtok(NULL, seps);
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/*
|
||
* UpdateCVClassIcon
|
||
*
|
||
* Purpose:
|
||
* Handles LBN_SELCHANGE for the Object Type listbox. On a selection
|
||
* change, we extract an icon from the server handling the currently
|
||
* selected object type using the utility function HIconFromClass.
|
||
* Note that we depend on the behavior of FillClassList to stuff the
|
||
* object class after a tab in the listbox string that we hide from
|
||
* view (see WM_INITDIALOG).
|
||
*
|
||
* Parameters
|
||
* hDlg HWND of the dialog box.
|
||
* lpCV LPCONVERT pointing to the dialog structure
|
||
* hList HWND of the Object Type listbox.
|
||
*
|
||
* Return Value:
|
||
* None
|
||
*/
|
||
|
||
void UpdateCVClassIcon(HWND hDlg, LPCONVERT lpCV, HWND hList)
|
||
{
|
||
UINT iSel;
|
||
DWORD cb;
|
||
HGLOBAL hMem;
|
||
LPTSTR pszName, pszCLSID;
|
||
CLSID clsid;
|
||
HICON hIcon, hOldIcon;
|
||
UINT cch, uWrapIndex;
|
||
RECT LabelRect;
|
||
TCHAR szLabel[OLEUI_CCHLABELMAX];
|
||
LPTSTR lpszLabel = szLabel;
|
||
HFONT hFont;
|
||
HWND hLabel1;
|
||
|
||
/*
|
||
* When we change object type selection, get the new icon for that
|
||
* type into our structure and update it in the display.
|
||
*/
|
||
|
||
iSel=(UINT)SendMessage(hList, LB_GETCURSEL, 0, 0L);
|
||
|
||
if (LB_ERR==(INT)iSel)
|
||
return;
|
||
|
||
//Allocate a string to hold the entire listbox string
|
||
cb=SendMessage(hList, LB_GETTEXTLEN, iSel, 0L);
|
||
|
||
hMem=GlobalAlloc(GHND, cb+1);
|
||
|
||
if (NULL==hMem)
|
||
return;
|
||
|
||
pszName=GlobalLock(hMem);
|
||
|
||
// Get whole string
|
||
SendMessage(hList, LB_GETTEXT, iSel, (LONG)pszName);
|
||
|
||
// Set pointer to CLSID (string)
|
||
pszCLSID = PointerToNthField(pszName, 2, TEXT('\t'));
|
||
|
||
//Create the class ID with this string.
|
||
CLSIDFromStringA(pszCLSID, &clsid);
|
||
|
||
hIcon = HIconAndSourceFromClass(&clsid, (LPTSTR)(lpCV->lpszIconSource), &(lpCV->IconIndex));
|
||
|
||
if (NULL == hIcon) // Use Vanilla Document
|
||
{
|
||
lstrcpy((LPTSTR)(lpCV->lpszIconSource), (LPTSTR)szOLE2DLL);
|
||
lpCV->IconIndex = 0; // 1st icon in OLE2.DLL
|
||
hIcon = ExtractIcon(ghInst,
|
||
(LPTSTR)(lpCV->lpszIconSource),
|
||
lpCV->IconIndex);
|
||
}
|
||
|
||
//Replace the current display with this new one.
|
||
hOldIcon = (HICON)SendDlgItemMessage(hDlg, IDCV_ICON, STM_SETICON, (WPARAM)hIcon, 0L);
|
||
|
||
hLabel1 = GetDlgItem(hDlg, IDCV_ICONLABEL1);
|
||
|
||
GetWindowRect(hLabel1, &LabelRect);
|
||
|
||
// Get the label
|
||
if (lpCV->lpOCV->lpszDefLabel) {
|
||
// width is used as 1.5 times width of icon window
|
||
lpszLabel = ChopText(hLabel1, ((LabelRect.right-LabelRect.left)*3)/2, (LPTSTR)lpCV->lpOCV->lpszDefLabel);
|
||
LSTRCPYN(szLabel, lpCV->lpOCV->lpszDefLabel, sizeof(szLabel)/sizeof(TCHAR));
|
||
} else {
|
||
if ((cch = OleStdGetAuxUserType(&clsid, AUXUSERTYPE_SHORTNAME,
|
||
(LPTSTR)szLabel, OLEUI_CCHLABELMAX_SIZE, NULL)) == 0) {
|
||
// If we can't get the AuxUserType2, then try the long name
|
||
if ((cch = OleStdGetUserTypeOfClass(&clsid, (LPTSTR)szLabel,
|
||
OLEUI_CCHKEYMAX_SIZE, NULL)) == 0) {
|
||
// last resort; use "Document" as label
|
||
LoadString(ghInst,IDS_DEFICONLABEL,(LPTSTR)szLabel,OLEUI_CCHLABELMAX);
|
||
cch = lstrlen((LPCTSTR)szLabel);
|
||
}
|
||
}
|
||
}
|
||
|
||
hFont = (HFONT)SendMessage(hLabel1, WM_GETFONT, 0, 0L);
|
||
|
||
// Figure out where to split the label
|
||
uWrapIndex = OleStdIconLabelTextOut(NULL, hFont, 0, 0, 0, &LabelRect, (LPTSTR)lpszLabel, cch, NULL);
|
||
|
||
if (0 == uWrapIndex)
|
||
{
|
||
SendMessage(hLabel1, WM_SETTEXT, 0, (LPARAM)(LPTSTR)lpszLabel);
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_SETTEXT, 0, (LPARAM)(LPTSTR)"");
|
||
}
|
||
else
|
||
{
|
||
TCHAR chKeep;
|
||
LPTSTR lpszSecondLine;
|
||
|
||
chKeep = szLabel[uWrapIndex];
|
||
lpszLabel[uWrapIndex] = TEXT('\0');
|
||
|
||
SendMessage(hLabel1, WM_SETTEXT, 0, (LPARAM)(LPTSTR)lpszLabel);
|
||
|
||
lpszLabel[uWrapIndex] = chKeep;
|
||
lpszSecondLine = lpszLabel + uWrapIndex;
|
||
|
||
SendDlgItemMessage(hDlg, IDCV_ICONLABEL2, WM_SETTEXT, 0, (LPARAM)lpszSecondLine);
|
||
}
|
||
|
||
// get rid of the old icon
|
||
if ((HICON)NULL != hOldIcon)
|
||
DestroyIcon(hOldIcon);
|
||
|
||
GlobalUnlock(hMem);
|
||
GlobalFree(hMem);
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
BOOL IsValidClassID(CLSID cID)
|
||
{
|
||
if (0 == _fmemcmp(&cID, &CLSID_NULL, sizeof(CLSID))) // if (CLSID_NULL == cID)
|
||
return FALSE;
|
||
else
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
/*
|
||
* SetConvertResults
|
||
*
|
||
* Purpose:
|
||
* Centralizes setting of the Result display in the Convert
|
||
* dialog. Handles loading the appropriate string from the module's
|
||
* resources and setting the text, displaying the proper result picture,
|
||
* and showing the proper icon.
|
||
*
|
||
* Parameters:
|
||
* hDlg HWND of the dialog box so we can access controls.
|
||
* lpCV LPCONVERT in which we assume that the dwFlags is
|
||
* set to the appropriate radio button selection, and
|
||
* the list box has the appropriate class selected.
|
||
*
|
||
* Return Value:
|
||
* None
|
||
*/
|
||
|
||
void SetConvertResults(HWND hDlg, LPCONVERT lpCV)
|
||
{
|
||
LPTSTR pszT, // temp
|
||
lpszOutput, // text sent in SetDlgItemText
|
||
lpszDefObj, // string containing default object class
|
||
lpszSelObj, // string containing selected object class
|
||
lpszString; // stirng we get from loadstring
|
||
|
||
UINT i, cch;
|
||
HGLOBAL hMem;
|
||
|
||
HWND hList; // handle to listbox (so we can just use SendMsg i
|
||
// instead of SendDlgItemMsg).
|
||
|
||
|
||
hList = lpCV->hListVisible;
|
||
/*
|
||
* We need scratch memory for loading the stringtable string, loading
|
||
* the object type from the listbox, loading the source object
|
||
* type, and constructing the final string. We therefore allocate
|
||
* four buffers as large as the maximum message length (512) plus
|
||
* the object type, guaranteeing that we have enough
|
||
* in all cases.
|
||
*/
|
||
i=(UINT)SendMessage(hList, LB_GETCURSEL, 0, 0L);
|
||
|
||
cch=512+(UINT)SendMessage(hList, LB_GETTEXTLEN, i, 0L);
|
||
|
||
hMem=GlobalAlloc(GHND, (DWORD)(4*cch));
|
||
|
||
if (NULL==hMem)
|
||
return;
|
||
|
||
lpszOutput = (LPTSTR)GlobalLock(hMem);
|
||
lpszSelObj = lpszOutput + cch;
|
||
lpszDefObj = lpszSelObj + cch;
|
||
lpszString = lpszDefObj + cch;
|
||
|
||
// Get selected object and null terminate human-readable name (1st field).
|
||
SendMessage(hList, LB_GETTEXT, i, (LONG)lpszSelObj);
|
||
|
||
pszT = PointerToNthField(lpszSelObj, 2, TEXT('\t'));
|
||
|
||
#ifdef WIN32
|
||
// AnsiPrev is obsolete in Win32
|
||
pszT = CharPrev((LPCTSTR) lpszSelObj, (LPCTSTR) pszT);
|
||
#else
|
||
pszT = AnsiPrev((LPCTSTR) lpszSelObj, (LPCTSTR) pszT);
|
||
#endif
|
||
|
||
*pszT = TEXT('\0');
|
||
|
||
// Get default object
|
||
|
||
GetDlgItemText(hDlg, IDCV_OBJECTTYPE, lpszDefObj, 512);
|
||
|
||
|
||
//Default is an empty string.
|
||
*lpszOutput=0;
|
||
|
||
|
||
if (lpCV->dwFlags & CF_SELECTCONVERTTO)
|
||
{
|
||
|
||
if (lpCV->lpOCV->fIsLinkedObject) // working with linked object
|
||
LoadString(ghInst, IDS_CVRESULTCONVERTLINK, lpszOutput, cch);
|
||
|
||
else
|
||
{
|
||
// converting to a new class
|
||
if (0 !=lstrcmp(lpszDefObj, lpszSelObj))
|
||
{
|
||
if (0 != LoadString(ghInst, IDS_CVRESULTCONVERTTO, lpszString, cch))
|
||
wsprintf(lpszOutput, lpszString, lpszDefObj, lpszSelObj);
|
||
|
||
}
|
||
else // converting to the same class (no conversion)
|
||
{
|
||
|
||
if (0 != LoadString(ghInst, IDS_CVRESULTNOCHANGE, lpszString, cch))
|
||
wsprintf(lpszOutput, lpszString, lpszDefObj);
|
||
}
|
||
|
||
}
|
||
|
||
if (lpCV->dvAspect == DVASPECT_ICON) // Display as icon is checked
|
||
{
|
||
if (0 != LoadString(ghInst, IDS_CVRESULTDISPLAYASICON, lpszString, cch))
|
||
lstrcat(lpszOutput, lpszString);
|
||
}
|
||
}
|
||
|
||
if (lpCV->dwFlags & CF_SELECTACTIVATEAS)
|
||
{
|
||
|
||
if (0!=LoadString(ghInst, IDS_CVRESULTACTIVATEAS, lpszString, cch))
|
||
wsprintf(lpszOutput, lpszString, lpszDefObj, lpszSelObj);
|
||
|
||
// activating as a new class
|
||
if (0 !=lstrcmp(lpszDefObj, lpszSelObj))
|
||
{
|
||
if (0!=LoadString(ghInst, IDS_CVRESULTACTIVATEDIFF, lpszString, cch))
|
||
lstrcat(lpszOutput, lpszString);
|
||
}
|
||
else // activating as itself.
|
||
{
|
||
lstrcat(lpszOutput, TEXT("."));
|
||
}
|
||
}
|
||
|
||
|
||
//If LoadString failed, we simply clear out the results (*lpszOutput=0 above)
|
||
SetDlgItemText(hDlg, IDCV_RESULTTEXT, lpszOutput);
|
||
|
||
GlobalUnlock(hMem);
|
||
GlobalFree(hMem);
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
* ConvertCleanup
|
||
*
|
||
* Purpose:
|
||
* Performs convert-specific cleanup before Convert termination.
|
||
*
|
||
* Parameters:
|
||
* hDlg HWND of the dialog box so we can access controls.
|
||
*
|
||
* Return Value:
|
||
* None
|
||
*/
|
||
void ConvertCleanup(HWND hDlg, LPCONVERT lpCV)
|
||
{
|
||
|
||
LPMALLOC pIMalloc;
|
||
|
||
|
||
// Free our strings. Zero out the user type name string
|
||
// the the calling app doesn't free to it.
|
||
|
||
if (NOERROR == CoGetMalloc(MEMCTX_TASK, &pIMalloc))
|
||
{
|
||
pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)lpCV->lpszConvertDefault);
|
||
pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)lpCV->lpszActivateDefault);
|
||
pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)lpCV->lpszIconSource);
|
||
if (lpCV->lpOCV->lpszUserType) {
|
||
pIMalloc->lpVtbl->Free(pIMalloc,(LPVOID)lpCV->lpOCV->lpszUserType);
|
||
lpCV->lpOCV->lpszUserType = NULL;
|
||
}
|
||
if (lpCV->lpOCV->lpszDefLabel) {
|
||
pIMalloc->lpVtbl->Free(pIMalloc,(LPVOID)lpCV->lpOCV->lpszDefLabel);
|
||
lpCV->lpOCV->lpszDefLabel = NULL;
|
||
}
|
||
|
||
pIMalloc->lpVtbl->Release(pIMalloc);
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
* SwapWindows
|
||
*
|
||
* Purpose:
|
||
* Moves hWnd1 to hWnd2's position and hWnd2 to hWnd1's position.
|
||
* Does NOT change sizes.
|
||
*
|
||
*
|
||
* Parameters:
|
||
* hDlg HWND of the dialog box so we can turn redraw off
|
||
*
|
||
* Return Value:
|
||
* None
|
||
*/
|
||
void SwapWindows(HWND hDlg, HWND hWnd1, HWND hWnd2)
|
||
{
|
||
|
||
RECT Rect1, Rect2;
|
||
|
||
|
||
GetWindowRect(hWnd1, &Rect1);
|
||
GetWindowRect(hWnd2, &Rect2);
|
||
|
||
ScreenToClient(hDlg, (LPPOINT)&Rect1.left);
|
||
ScreenToClient(hDlg, (LPPOINT)&Rect1.right);
|
||
|
||
ScreenToClient(hDlg, (LPPOINT)&Rect2.left);
|
||
ScreenToClient(hDlg, (LPPOINT)&Rect2.right);
|
||
|
||
SetWindowPos(hWnd1,
|
||
NULL,
|
||
Rect2.left,
|
||
Rect2.top,
|
||
0,
|
||
0,
|
||
SWP_NOZORDER | SWP_NOSIZE);
|
||
|
||
SetWindowPos(hWnd2,
|
||
NULL,
|
||
Rect1.left,
|
||
Rect1.top,
|
||
0,
|
||
0,
|
||
SWP_NOZORDER | SWP_NOSIZE);
|
||
|
||
return;
|
||
|
||
}
|
||
|