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.
 
 
 
 
 
 

148 lines
4.2 KiB

//
// File: UnicowsSupport.c
// Date: 22 March 2001
// Purpose: This file contains functions that supplement the Unicode wrapper layer
//
#define UNICODE
#include "atlbase.h"
#include "oledlg.h"
static const char CDCommonFilesKey [] = "Software\\My Company",
CDCommonFilesValueName [] = "UnicowsLocation",
UnicowsName [] = "\\unicows.dll";
static HMODULE __stdcall LoadUnicows (void)
{
HMODULE hUnicows = 0;
HKEY hKey = 0;
LONG errCode = RegOpenKeyExA (HKEY_LOCAL_MACHINE,
CDCommonFilesKey,
0,
KEY_READ,
&hKey);
if (errCode == ERROR_SUCCESS)
{
DWORD dwType = 0,
cbData = 0;
errCode = RegQueryValueExA (hKey,
CDCommonFilesValueName,
0,
&dwType,
0,
&cbData);
if (errCode == ERROR_SUCCESS && dwType == REG_SZ)
{
char *unicowsPath = (char *)alloca (cbData + strlen (UnicowsName));
errCode = RegQueryValueExA (hKey,
CDCommonFilesValueName,
0,
&dwType,
(BYTE *)unicowsPath,
&cbData);
if (errCode == ERROR_SUCCESS)
{
if (unicowsPath [strlen (unicowsPath) - 1] == '\\')
strcat (unicowsPath, UnicowsName + 1);
else
strcat (unicowsPath, UnicowsName);
hUnicows = LoadLibraryA (unicowsPath);
}
}
RegCloseKey (hKey);
}
if (hUnicows == 0)
{
MessageBoxA (0, "Unicode wrapper not found", "My Company", MB_ICONSTOP | MB_OK);
_exit (-1);
}
return hUnicows;
}
extern "C" HMODULE (__stdcall *_PfnLoadUnicows) (void) = &LoadUnicows;
//
// Wrappers for functions not handled by Godot
//
static BOOL __stdcall UserOleUIAddVerbMenuW(
LPOLEOBJECT lpOleObj, //Pointer to the object
LPCWSTR lpszShortType, //Pointer to the short name corresponding
// to the object
HMENU hMenu, //Handle to the menu to modify
UINT uPos, //Position of the menu item.
UINT uIDVerbMin, //Value at which to start the verbs
UINT uIDVerbMax, //Maximum identifier value for object verbs
BOOL bAddConvert, //Whether to add convert item
UINT idConvert, //Value to use for the convert item
HMENU FAR * lphMenu //Pointer to the cascading verb menu, if
// created
)
{
USES_CONVERSION;
return OleUIAddVerbMenuA (lpOleObj,
W2CA (lpszShortType),
hMenu,
uPos,
uIDVerbMin,
uIDVerbMax,
bAddConvert,
idConvert,
lphMenu);
}
extern "C" FARPROC Unicows_OleUIAddVerbMenuW = (FARPROC)&UserOleUIAddVerbMenuW;
static UINT __stdcall UserOleUIInsertObjectW (LPOLEUIINSERTOBJECTW lpouiiow)
{
UINT result = OLEUI_CANCEL;
OLEUIINSERTOBJECTA ouiioa;
ATLASSERT (sizeof (OLEUIINSERTOBJECTA) == sizeof (OLEUIINSERTOBJECTW));
memcpy (&ouiioa, lpouiiow, sizeof (OLEUIINSERTOBJECTA));
ATLASSERT (lpouiiow->lpszCaption == 0);
ATLASSERT (lpouiiow->lpszTemplate == 0);
ouiioa.lpszFile = (char *)alloca (ouiioa.cchFile + 1);
ouiioa.lpszFile [0] = '\0';
result = OleUIInsertObjectA(&ouiioa);
if (result == OLEUI_SUCCESS)
{
USES_CONVERSION;
wchar_t *lpszFile = lpouiiow->lpszFile;
memcpy (lpouiiow, &ouiioa, sizeof (OLEUIINSERTOBJECTW));
lpouiiow->lpszFile = lpszFile;
wcscpy (lpouiiow->lpszFile, A2CW (ouiioa.lpszFile));
}
return result;
}
extern "C" FARPROC Unicows_OleUIInsertObjectW = (FARPROC)&UserOleUIInsertObjectW;