#include #include #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; }