📄 helpers.cpp
字号:
#else
pObj->GetUserType(USERCLASSTYPE_FULL, &pszw);
WideCharToMultiByte(CP_ACP, 0, pszw, -1, szTemp
, sizeof(szTemp), NULL, NULL);
pszName=szTemp;
#endif
if (fLink && NULL!=pszName)
wsprintf(szName, TEXT("Linked %s"), pszName);
else
lstrcpy(szName, pszName);
#ifndef WIN32ANSI
//#ifdef UNICODE
CoTaskMemFree(pszName);
#else
CoTaskMemFree(pszw);
pszw=NULL;
#endif
/*
* Get the source name of this object using either the
* link display name (for link) or a moniker display
* name.
*/
if (fLink)
{
#ifndef WIN32ANSI
//#ifdef UNICODE
hr=pLink->GetSourceDisplayName(&pszSrc);
#else
hr=pLink->GetSourceDisplayName(&pszw);
WideCharToMultiByte(CP_ACP, 0, pszw, -1, szTemp
, sizeof(szTemp), NULL, NULL);
pszSrc=szTemp;
#endif
}
else
{
IMoniker *pmk;
hr=pObj->GetMoniker(OLEGETMONIKER_TEMPFORUSER
, OLEWHICHMK_OBJFULL, &pmk);
if (SUCCEEDED(hr))
{
IBindCtx *pbc;
CreateBindCtx(0, &pbc);
#ifndef WIN32ANSI
//#ifdef UNICODE
pmk->GetDisplayName(pbc, NULL, &pszSrc);
#else
pmk->GetDisplayName(pbc, NULL, &pszw);
WideCharToMultiByte(CP_ACP, 0, pszw, -1, szTemp
, sizeof(szTemp), NULL, NULL);
pszSrc=szTemp;
#endif
pbc->Release();
pmk->Release();
}
}
if (fLink)
pLink->Release();
//Get MiscStatus bits
hr=pObj->GetMiscStatus(dwAspect, &dwMisc);
//Get OBJECTDESCRIPTOR
hMem=INOLE_AllocObjectDescriptor(clsID, dwAspect, szl, ptl
, dwMisc, szName, pszSrc);
#ifndef WIN32ANSI
//#ifdef UNICODE
CoTaskMemFree(pszSrc);
#else
if (NULL!=pszw)
CoTaskMemFree(pszw);
#endif
return hMem;
}
/*
* INOLE_AllocObjectDescriptor
*
* Purpose:
* Allocated and fills an OBJECTDESCRIPTOR structure.
*
* Parameters:
* clsID CLSID to store.
* dwAspect DWORD with the display aspect
* pszl LPSIZEL (optional) if the object is being scaled in
* its container, then the container should pass the
* extents that it is using to display the object.
* ptl POINTL from upper-left corner of object where
* mouse went down for use with Drag & Drop.
* dwMisc DWORD containing MiscStatus flags
* pszName LPTSTR naming the object to copy
* pszSrc LPTSTR identifying the source of the object.
*
* Return Value:
* HBGLOBAL Handle to OBJECTDESCRIPTOR structure.
*/
STDAPI_(HGLOBAL) INOLE_AllocObjectDescriptor(CLSID clsID
, DWORD dwAspect, SIZEL szl, POINTL ptl, DWORD dwMisc
, LPTSTR pszName, LPTSTR pszSrc)
{
HGLOBAL hMem=NULL;
LPOBJECTDESCRIPTOR pOD;
DWORD cb, cbStruct;
DWORD cchName, cchSrc;
cchName=lstrlen(pszName)+1;
if (NULL!=pszSrc)
cchSrc=lstrlen(pszSrc)+1;
else
{
cchSrc=cchName;
pszSrc=pszName;
}
/*
* Note: CFSTR_OBJECTDESCRIPTOR is an ANSI structure.
* That means strings in it must be ANSI. OLE will do
* internal conversions back to Unicode as necessary,
* but we have to put ANSI strings in it ourselves.
*/
cbStruct=sizeof(OBJECTDESCRIPTOR);
cb=cbStruct+(sizeof(WCHAR)*(cchName+cchSrc)); //HACK
hMem=GlobalAlloc(GHND, cb);
if (NULL==hMem)
return NULL;
pOD=(LPOBJECTDESCRIPTOR)GlobalLock(hMem);
pOD->cbSize=cb;
pOD->clsid=clsID;
pOD->dwDrawAspect=dwAspect;
pOD->sizel=szl;
pOD->pointl=ptl;
pOD->dwStatus=dwMisc;
if (pszName)
{
pOD->dwFullUserTypeName=cbStruct;
#ifdef WIN32ANSI
MultiByteToWideChar(CP_ACP, 0, pszName, -1
, (LPWSTR)((LPBYTE)pOD+pOD->dwFullUserTypeName), cchName);
#else
lstrcpy((LPTSTR)((LPBYTE)pOD+pOD->dwFullUserTypeName)
, pszName);
#endif
}
else
pOD->dwFullUserTypeName=0; //No string
if (pszSrc)
{
pOD->dwSrcOfCopy=cbStruct+(cchName*sizeof(WCHAR));
#ifdef WIN32ANSI
MultiByteToWideChar(CP_ACP, 0, pszSrc, -1
, (LPWSTR)((LPBYTE)pOD+pOD->dwSrcOfCopy), cchSrc);
#else
lstrcpy((LPTSTR)((LPBYTE)pOD+pOD->dwSrcOfCopy), pszSrc);
#endif
}
else
pOD->dwSrcOfCopy=0; //No string
GlobalUnlock(hMem);
return hMem;
}
/*
* INOLE_CreateStorageOnHGlobal
*
* Purpose:
* Create a memory based storage object on an memory lockbytes.
*
* Parameters:
* grfMode -- flags passed to StgCreateDocfileOnILockBytes
*
* NOTE: if hGlobal is NULL, then a new IStorage is created and
* STGM_CREATE flag is passed to StgCreateDocfileOnILockBytes.
* if hGlobal is non-NULL, then it is assumed that the hGlobal already
* has an IStorage inside it and STGM_CONVERT flag is passed
* to StgCreateDocfileOnILockBytes.
*
* Return Value:
* IStorage * Pointer to the storage we create.
*/
STDAPI_(IStorage *) INOLE_CreateStorageOnHGlobal(DWORD grfMode)
{
DWORD grfCreate=grfMode | STGM_CREATE;
HRESULT hr;
ILockBytes *pLB=NULL;
IStorage *pIStorage=NULL;
hr=CreateILockBytesOnHGlobal(NULL, TRUE, &pLB);
if (FAILED(hr))
return NULL;
hr=StgCreateDocfileOnILockBytes(pLB, grfCreate, 0, &pIStorage);
pLB->Release();
return SUCCEEDED(hr) ? pIStorage : NULL;
}
/*
* INOLE_GetLinkSourceData
*
* Purpose:
* Creates a CFSTR_LINKSOURCE data format, that is, a serialized
* moniker in a stream.
*
* Parameters:
* pmk IMoniker * of the link.
* pClsID CLSID * to write into the stream.
* pFE FORMATETC * describing the data which
* should have TYMED_ISTREAM in it.
* pSTM STGMEDIUM in which to return the data.
* If this has TYMED_NULL, then this function
* allocates the stream, otherwise it writes
* into the stream in pSTM->pstm.
*/
STDAPI INOLE_GetLinkSourceData(IMoniker *pmk, LPCLSID pClsID
, LPFORMATETC pFE, LPSTGMEDIUM pSTM)
{
LPSTREAM pIStream = NULL;
DWORD reserved = 0;
HRESULT hr;
pSTM->pUnkForRelease=NULL;
if (TYMED_NULL==pSTM->tymed)
{
if (pFE->tymed & TYMED_ISTREAM)
{
hr=CreateStreamOnHGlobal(NULL, TRUE, &pIStream);
if (FAILED(hr))
return ResultFromScode(E_OUTOFMEMORY);
pSTM->pstm=pIStream;
pSTM->tymed=TYMED_ISTREAM;
}
else
return ResultFromScode(DATA_E_FORMATETC);
}
else
{
if (TYMED_ISTREAM==pSTM->tymed)
{
pSTM->tymed=TYMED_ISTREAM;
pSTM->pstm=pSTM->pstm;
}
else
return ResultFromScode(DATA_E_FORMATETC);
}
hr=OleSaveToStream(pmk, pSTM->pstm);
if (FAILED(hr))
return hr;
return WriteClassStm(pSTM->pstm, *pClsID);
}
/*
* INOLE_RegisterAsRunning
*
* Purpose:
* Registers a moniker as running in the running object
* table, revoking any existing registration.
*
* Parameters:
* pUnk IUnknown * of the object.
* pmk IMoniker * naming the object.
* dwFlags DWORD flags to pass to IROT::Register
* pdwReg LPDWORD in which to store the registration key.
*
* Return Value:
* None
*/
STDAPI_(void) INOLE_RegisterAsRunning(IUnknown *pUnk
, IMoniker *pmk, DWORD dwFlags, LPDWORD pdwReg)
{
IRunningObjectTable *pROT;
HRESULT hr;
DWORD dwReg=*pdwReg;
if (NULL==pmk || NULL==pUnk || NULL==pdwReg)
return;
dwReg=*pdwReg;
if (FAILED(GetRunningObjectTable(0, &pROT)))
return;
hr=pROT->Register(dwFlags, pUnk, pmk, pdwReg);
if (MK_S_MONIKERALREADYREGISTERED==GetScode(hr))
{
if (0!=dwReg)
pROT->Revoke(dwReg);
}
pROT->Release();
return;
}
/*
* INOLE_RevokeAsRunning
*
* Purpose:
* Wrapper for IRunningObjectTable::Revoke
*
* Parameters:
* pdwReg LPDWORD containing the key on input, zeroed
* on output.
*
* Return Value:
* None
*/
STDAPI_(void) INOLE_RevokeAsRunning(LPDWORD pdwReg)
{
IRunningObjectTable *pROT;
if (0==*pdwReg)
return;
if (FAILED(GetRunningObjectTable(0, &pROT)))
return;
pROT->Revoke(*pdwReg);
pROT->Release();
*pdwReg=0;
return;
}
/*
* INOLE_NoteChangeTime
*
* Purpose:
* Wrapper for IRunningObjectTable::NoteChangeTime
*
* Parameters:
* dwReg DWORD identifying the running object to note.
* pft FILETIME * containing the new time. If NULL,
* then we'll get it from CoFileTimeNow.
* pszFile LPTSTR to a filename. If pft is NULL, we'll
* retrieve times from this file.
*
* Return Value:
* None
*/
STDAPI_(void) INOLE_NoteChangeTime(DWORD dwReg, FILETIME *pft
, LPTSTR pszFile)
{
IRunningObjectTable *pROT;
FILETIME ft;
if (NULL==pft)
{
CoFileTimeNow(&ft);
pft=&ft;
}
if (NULL!=pszFile)
GetFileTimes(pszFile, pft);
if (FAILED(GetRunningObjectTable(0, &pROT)))
return;
pROT->NoteChangeTime(dwReg, pft);
pROT->Release();
return;
}
/*
* GetFileTimes
* (Internal)
*
* Purpose:
* Retrieve the FILETIME structure for a given file.
*/
static BOOL GetFileTimes(LPTSTR pszFileName, FILETIME *pft)
{
#ifdef WIN32
WIN32_FIND_DATA fd;
HANDLE hFind;
hFind=FindFirstFile(pszFileName, &fd);
if (NULL==hFind || INVALID_HANDLE_VALUE==hFind)
return FALSE;
FindClose(hFind);
*pft=fd.ftLastWriteTime;
return TRUE;
#else
static char sz[256];
static struct _find_t fileinfo;
lstrcpyn((LPSTR)sz, pszFileName, sizeof(sz)-1);
sz[sizeof(sz)-1]= '\0';
AnsiToOem(sz, sz);
return (_dos_findfirst(sz,_A_NORMAL|_A_HIDDEN|_A_SUBDIR|_A_SYSTEM
, (struct _find_t *)&fileinfo) == 0
&& CoDosDateTimeToFileTime(fileinfo.wr_date, fileinfo.wr_time
, pft));
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -