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.
148 lines
4.2 KiB
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;
|
|
|