// // 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;