windows-nt/Source/XPSP1/NT/com/oleutest/letest/ole2ui/olethunk.c
2020-09-26 16:20:57 +08:00

650 lines
11 KiB
C

#include <windows.h>
#include <ole2.h>
#include "olethunk.h"
STDAPI_(LPVOID) OleStdMalloc(ULONG ulSize);
STDAPI_(void) OleStdFree(LPVOID pmem);
STDAPI_(void) CopyAndFreeOLESTR(LPOLESTR polestr, LPSTR *ppszOut)
{
// See if there is any work
if (polestr == NULL)
{
if (ppszOut != NULL)
{
// Output string requested so set it to NULL.
*ppszOut = NULL;
}
return;
}
if (ppszOut)
{
// Copy of string converted to ANSI is requested
int len = wcslen(polestr) + 1;
*ppszOut = OleStdMalloc(len);
if (*ppszOut)
{
wcstombs(*ppszOut, polestr, len);
}
}
// Free the original string
OleStdFree(polestr);
}
STDAPI_(void) CopyAndFreeSTR(LPSTR pstr, LPOLESTR *ppolestrOut)
{
// See if there is any work
if (pstr == NULL)
{
if (ppolestrOut != NULL)
{
// Output string requested so set it to NULL.
*ppolestrOut = NULL;
}
return;
}
if (ppolestrOut)
{
// Copy of string converted to ANSI is requested
int len = strlen(pstr) + 1;
*ppolestrOut = OleStdMalloc(len * sizeof(WCHAR));
if (*ppolestrOut)
{
mbstowcs(*ppolestrOut, pstr, len);
}
}
// Free the original string
OleStdFree(pstr);
}
STDAPI_(LPOLESTR) CreateOLESTR(LPCSTR pszIn)
{
// Return NULL if there was no string input
LPOLESTR polestr = NULL;
if (pszIn != NULL)
{
// Calculate size of string to allocate
int len = strlen(pszIn) + 1;
// Allocate the string
polestr = (LPOLESTR) OleStdMalloc(len * sizeof(OLECHAR));
// Convert the string
if (polestr)
{
mbstowcs(polestr, pszIn, len);
}
}
return polestr;
}
STDAPI_(LPSTR) CreateSTR(LPCOLESTR polestrIn)
{
// Return NULL if there was no string input
LPSTR pstr = NULL;
if (polestrIn != NULL)
{
// Calculate size of string to allocate
int len = wcslen(polestrIn) + 1;
// Allocate the string
pstr = (PSTR) OleStdMalloc(len);
// Convert the string
if (pstr)
{
wcstombs(pstr, polestrIn, len);
}
}
return pstr;
}
STDAPI_(void) CLSIDFromStringA(LPSTR pszClass, LPCLSID pclsid)
{
CREATEOLESTR(polestr, pszClass)
CLSIDFromString(polestr, pclsid);
FREEOLESTR(polestr)
}
STDAPI CreateFileMonikerA(LPSTR lpszPathName, LPMONIKER FAR* ppmk)
{
CREATEOLESTR(polestr, lpszPathName)
HRESULT hr = CreateFileMoniker(polestr, ppmk);
FREEOLESTR(polestr)
return hr;
}
STDAPI CreateItemMonikerA(
LPSTR lpszDelim,
LPSTR lpszItem,
LPMONIKER FAR* ppmk)
{
CREATEOLESTR(polestrDelim, lpszDelim)
CREATEOLESTR(polestrItem, lpszItem)
HRESULT hr = CreateItemMoniker(polestrDelim, polestrItem, ppmk);
FREEOLESTR(polestrDelim)
FREEOLESTR(polestrItem)
return hr;
}
STDAPI_(HGLOBAL) OleGetIconOfClassA(
REFCLSID rclsid,
LPSTR lpszLabel,
BOOL fUseTypeAsLabel)
{
CREATEOLESTR(polestr, lpszLabel)
HGLOBAL hglobal = OleGetIconOfClass(rclsid, polestr, fUseTypeAsLabel);
FREEOLESTR(polestr)
return hglobal;
}
STDAPI_(HGLOBAL) OleGetIconOfFileA(LPSTR lpszPath, BOOL fUseFileAsLabel)
{
CREATEOLESTR(polestr, lpszPath)
HGLOBAL hMetaPict = OleGetIconOfFile(polestr, fUseFileAsLabel);
FREEOLESTR(polestr)
return hMetaPict;
}
STDAPI_(HGLOBAL) OleMetafilePictFromIconAndLabelA(
HICON hIcon,
LPSTR lpszLabel,
LPSTR lpszSourceFile,
UINT iIconIndex)
{
CREATEOLESTR(polestrLabel, lpszLabel)
CREATEOLESTR(polestrSourceFile, lpszSourceFile)
HGLOBAL hglobal = OleMetafilePictFromIconAndLabel(hIcon, polestrLabel,
polestrSourceFile, iIconIndex);
FREEOLESTR(polestrLabel)
FREEOLESTR(polestrSourceFile)
return hglobal;
}
STDAPI GetClassFileA(LPCSTR szFilename, CLSID FAR* pclsid)
{
CREATEOLESTR(polestr, szFilename)
HRESULT hr = GetClassFile(polestr, pclsid);
FREEOLESTR(polestr)
return hr;
}
STDAPI CLSIDFromProgIDA(LPCSTR lpszProgID, LPCLSID lpclsid)
{
CREATEOLESTR(polestr, lpszProgID)
HRESULT hr = CLSIDFromProgID(polestr, lpclsid);
FREEOLESTR(polestr)
return hr;
}
STDAPI MkParseDisplayNameA(
LPBC pbc,
LPSTR szUserName,
ULONG FAR * pchEaten,
LPMONIKER FAR * ppmk)
{
CREATEOLESTR(polestr, szUserName)
HRESULT hr = MkParseDisplayName(pbc, polestr, pchEaten, ppmk);
FREEOLESTR(polestr)
return hr;
}
STDAPI OleCreateLinkToFileA(
LPCSTR lpszFileName,
REFIID riid,
DWORD renderopt,
LPFORMATETC lpFormatEtc,
LPOLECLIENTSITE pClientSite,
LPSTORAGE pStg,
LPVOID FAR* ppvObj)
{
CREATEOLESTR(polestr, lpszFileName)
HRESULT hr = OleCreateLinkToFile(polestr, riid, renderopt, lpFormatEtc,
pClientSite, pStg, ppvObj);
FREEOLESTR(polestr)
return hr;
}
STDAPI OleCreateFromFileA(
REFCLSID rclsid,
LPCSTR lpszFileName,
REFIID riid,
DWORD renderopt,
LPFORMATETC lpFormatEtc,
LPOLECLIENTSITE pClientSite,
LPSTORAGE pStg,
LPVOID FAR* ppvObj)
{
CREATEOLESTR(polestr, lpszFileName)
HRESULT hr = OleCreateFromFile(rclsid, polestr, riid, renderopt,
lpFormatEtc, pClientSite, pStg, ppvObj);
FREEOLESTR(polestr)
return hr;
}
STDAPI OleRegGetUserTypeA(
REFCLSID clsid,
DWORD dwFormOfType,
LPSTR FAR* ppszUserType)
{
LPOLESTR polestr;
HRESULT hr = OleRegGetUserType(clsid, dwFormOfType, &polestr);
CopyAndFreeOLESTR(polestr, ppszUserType);
return hr;
}
STDAPI ProgIDFromCLSIDA(REFCLSID clsid, LPSTR FAR* lplpszProgID)
{
LPOLESTR polestr;
HRESULT hr = ProgIDFromCLSID(clsid, &polestr);
CopyAndFreeOLESTR(polestr, lplpszProgID);
return hr;
}
STDAPI ReadFmtUserTypeStgA(
LPSTORAGE pstg,
CLIPFORMAT FAR* pcf,
LPSTR FAR* lplpszUserType)
{
LPOLESTR polestr;
HRESULT hr = ReadFmtUserTypeStg(pstg, pcf, &polestr);
CopyAndFreeOLESTR(polestr, lplpszUserType);
return hr;
}
STDAPI StgCreateDocfileA(
LPCSTR lpszName,
DWORD grfMode,
DWORD reserved,
IStorage FAR * FAR *ppstgOpen)
{
HRESULT hr;
LPOLESTR polestr = NULL;
if (lpszName != NULL)
{
polestr = CreateOLESTR(lpszName);
}
hr = StgCreateDocfile(polestr, grfMode, reserved, ppstgOpen);
FREEOLESTR(polestr)
return hr;
}
STDAPI StgOpenStorageA(
LPCSTR lpszName,
IStorage FAR *pstgPriority,
DWORD grfMode,
SNB snbExclude,
DWORD reserved,
IStorage FAR * FAR *ppstgOpen)
{
CREATEOLESTR(polestr, lpszName)
HRESULT hr = StgOpenStorage(polestr, pstgPriority, grfMode, snbExclude,
reserved, ppstgOpen);
FREEOLESTR(polestr)
return hr;
}
STDAPI StgSetTimesA(
LPSTR lpszName,
FILETIME const FAR* pctime,
FILETIME const FAR* patime,
FILETIME const FAR* pmtime)
{
CREATEOLESTR(polestr, lpszName)
HRESULT hr = StgSetTimes(polestr, pctime, patime, pmtime);
FREEOLESTR(polestr)
return hr;
}
STDAPI_(void) StringFromCLSIDA(REFCLSID rclsid, LPSTR *lplpszCLSID)
{
LPOLESTR polestr;
StringFromCLSID(rclsid, &polestr);
CopyAndFreeOLESTR(polestr, lplpszCLSID);
}
STDAPI WriteFmtUserTypeStgA(
LPSTORAGE lpStg,
CLIPFORMAT cf,
LPSTR lpszUserType)
{
CREATEOLESTR(polestr, lpszUserType)
HRESULT hr = WriteFmtUserTypeStg(lpStg, cf, polestr);
FREEOLESTR(polestr)
return hr;
}
STDAPI CallIMonikerGetDisplayNameA(
LPMONIKER lpmk,
IBindCtx *pbc,
IMoniker *pmkToLeft,
LPSTR *ppszDisplayName)
{
LPOLESTR polestr;
HRESULT hr = lpmk->lpVtbl->GetDisplayName(lpmk, pbc, NULL,
&polestr);
CopyAndFreeOLESTR(polestr, ppszDisplayName);
return hr;
}
STDAPI CallIOleInPlaceUIWindowSetActiveObjectA(
IOleInPlaceUIWindow FAR *lpthis,
IOleInPlaceActiveObject *pActiveObject,
LPCSTR pszObjName)
{
CREATEOLESTR(polestr, pszObjName)
HRESULT hr = lpthis->lpVtbl->SetActiveObject(lpthis, pActiveObject,
polestr);
FREEOLESTR(polestr)
return hr;
}
STDAPI CallIOleInPlaceFrameSetStatusTextA(
IOleInPlaceFrame *poleinplc,
LPCSTR pszStatusText)
{
CREATEOLESTR(polestr, pszStatusText)
HRESULT hr = poleinplc->lpVtbl->SetStatusText(poleinplc, polestr);
FREEOLESTR(polestr)
return hr;
}
STDAPI CallIOleLinkGetSourceDisplayNameA(
IOleLink FAR *polelink,
LPSTR *ppszDisplayName)
{
LPOLESTR polestr;
HRESULT hr = polelink->lpVtbl->GetSourceDisplayName(polelink, &polestr);
CopyAndFreeOLESTR(polestr, ppszDisplayName);
return hr;
}
STDAPI CallIOleLinkSetSourceDisplayNameA(
IOleLink FAR *polelink,
LPCSTR pszStatusText)
{
CREATEOLESTR(polestr, pszStatusText)
HRESULT hr = polelink->lpVtbl->SetSourceDisplayName(polelink, polestr);
FREEOLESTR(polestr)
return hr;
}
STDAPI CallIOleObjectGetUserTypeA(
LPOLEOBJECT lpOleObject,
DWORD dwFormOfType,
LPSTR *ppszUserType)
{
LPOLESTR polestr;
HRESULT hr = lpOleObject->lpVtbl->GetUserType(lpOleObject,
dwFormOfType, &polestr);
CopyAndFreeOLESTR(polestr, ppszUserType);
return hr;
}
STDAPI CallIOleObjectSetHostNamesA(
LPOLEOBJECT lpOleObject,
LPCSTR szContainerApp,
LPCSTR szContainerObj)
{
CREATEOLESTR(polestrApp, szContainerApp)
CREATEOLESTR(polestrObj, szContainerObj)
HRESULT hr = lpOleObject->lpVtbl->SetHostNames(lpOleObject, polestrApp,
polestrObj);
FREEOLESTR(polestrApp)
FREEOLESTR(polestrObj)
return hr;
}
STDAPI CallIStorageDestroyElementA(
LPSTORAGE lpStg,
LPSTR pszName)
{
CREATEOLESTR(polestr, pszName)
HRESULT hr = lpStg->lpVtbl->DestroyElement(lpStg, polestr);
FREEOLESTR(polestr)
return hr;
}
STDAPI CallIStorageCreateStorageA(
LPSTORAGE lpStg,
const char *pszName,
DWORD grfMode,
DWORD dwStgFmt,
DWORD reserved2,
IStorage **ppstg)
{
CREATEOLESTR(polestr, pszName)
HRESULT hr = lpStg->lpVtbl->CreateStorage(lpStg, polestr, grfMode,
dwStgFmt, reserved2, ppstg);
FREEOLESTR(polestr)
return hr;
}
STDAPI CallIStorageOpenStorageA(
LPSTORAGE lpStg,
const char *pszName,
IStorage *pstgPriority,
DWORD grfMode,
SNB snbExclude,
DWORD reserved,
IStorage **ppstg)
{
CREATEOLESTR(polestr, pszName)
HRESULT hr = lpStg->lpVtbl->OpenStorage(lpStg, polestr, pstgPriority,
grfMode, snbExclude, reserved, ppstg);
FREEOLESTR(polestr)
return hr;
}
STDAPI CallIStorageCreateStreamA(
LPSTORAGE lpStg,
LPSTR pszName,
DWORD grfMode,
DWORD reserved1,
DWORD reserved2,
IStream **ppstm)
{
CREATEOLESTR(polestr, pszName)
HRESULT hr = lpStg->lpVtbl->CreateStream(lpStg, polestr,
grfMode, reserved1, reserved2, ppstm);
FREEOLESTR(polestr)
return hr;
}
STDAPI CallIStorageOpenStreamA(
LPSTORAGE lpStg,
LPSTR pszName,
void *reserved1,
DWORD grfMode,
DWORD reserved2,
IStream **ppstm)
{
CREATEOLESTR(polestr, pszName)
HRESULT hr = lpStg->lpVtbl->OpenStream(lpStg, polestr, reserved1,
grfMode, reserved2, ppstm);
FREEOLESTR(polestr)
return hr;
}