650 lines
11 KiB
C
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;
|
||
|
}
|