📄 msg.cpp
字号:
case VT_I2:
case VT_UI2:
pvarBody->iVal = *(short *)m_pbBody;
break;
case VT_I4:
case VT_UI4:
pvarBody->lVal = *(long *)m_pbBody;
break;
case VT_R4:
pvarBody->fltVal = *(float *)m_pbBody;
break;
case VT_R8:
pvarBody->dblVal = *(double *)m_pbBody;
break;
case VT_CY:
pvarBody->cyVal = *(CY *)m_pbBody;
break;
case VT_DATE:
pvarBody->date = *(DATE *)m_pbBody;
break;
case VT_BOOL:
pvarBody->boolVal = *(VARIANT_BOOL *)m_pbBody;
break;
case VT_I1:
case VT_UI1:
pvarBody->bVal = *(UCHAR *)m_pbBody;
break;
case VT_LPSTR:
//
// coerce ansi to unicode
//
// alloc large enough unicode buffer
IfNullGo(wszTmp = new WCHAR[m_cbBody * 2]);
cchBody = MultiByteToWideChar(CP_ACP,
0,
(LPCSTR)m_pbBody,
-1,
wszTmp,
m_cbBody * 2);
if (cchBody != 0) {
IfNullGo(pvarBody->bstrVal = SysAllocString(wszTmp));
}
else {
IfFailGo(hresult = E_OUTOFMEMORY);
}
// map string to BSTR
vt = VT_BSTR;
#if DEBUG
RemBstrNode(pvarBody->bstrVal);
#endif // DEBUG
break;
case VT_LPWSTR:
// map wide string to BSTR
vt = VT_BSTR;
//
// fall through...
//
case VT_BSTR:
// Construct bstr to return
IfNullFail(pvarBody->bstrVal =
SysAllocStringByteLen(
(const char *)m_pbBody,
m_cbBody));
#if DEBUG
RemBstrNode(pvarBody->bstrVal);
#endif // DEBUG
break;
default:
IfFailGo(hresult = E_INVALIDARG);
break;
} // switch
pvarBody->vt = vt;
// fall through...
Error:
delete [] wszTmp;
return CreateErrorHelper(hresult, m_ObjectType);
}
//=--------------------------------------------------------------------------=
// CMSMQMessage::UpdateBodyBuffer
//=--------------------------------------------------------------------------=
// Sets message body
//
// Parameters:
// cbBody [in] body length
// pvBody [in] pointer to body buffer
//
// Output:
//
// Notes:
// updates m_hMem, m_pbBody, m_cbBody: might produce
// empty message.
//
HRESULT CMSMQMessage::UpdateBodyBuffer(ULONG cbBody, void *pvBody)
{
HRESULT hresult = NOERROR;
EnterCriticalSection(&m_CSlocal);
GLOBALFREE(m_hMem);
m_pbBody = NULL;
m_cbBody = 0;
IfNullRet(m_hMem = GLOBALALLOC_MOVEABLE_NONDISCARD(cbBody));
IfNullGo(m_pbBody = (BYTE *)GlobalLock(m_hMem));
memcpy(m_pbBody, pvBody, cbBody);
GLOBALUNLOCK(m_hMem);
m_cbBody = cbBody;
return hresult;
Error:
GLOBALFREE(m_hMem);
LeaveCriticalSection(&m_CSlocal);
return hresult;
}
//=--------------------------------------------------------------------------=
// CMSMQMessage::GetStreamOfBody
//=--------------------------------------------------------------------------=
// Sets message body
//
// Parameters:
// cbBody [in] body length
// pvBody [in] pointer to body buffer
// hMem [in] handle to body buffer
// ppstm [out] points to stream inited with body
//
// Output:
//
// Notes:
// Creates a new in-memory stream and inits it
// with incoming buffer, resets the seek pointer
// and returns the stream.
//
HRESULT CMSMQMessage::GetStreamOfBody(
ULONG cbBody,
void *pvBody,
// HGLOBAL hMem,
IStream **ppstm)
{
#if 0 // not yet implemented
HRESULT hresult;
LARGE_INTEGER li;
IStream *pstm = NULL;
// pessimism
*ppstm = NULL;
HGLOBAL hMem = GlobalHandle(pvBody);
ASSERT(hMem, L"bad handle.");
#if DEBUG
// DWORD cbSize;
// cbSize = GlobalSize(hMem);
#endif // DEBUG
IfFailRet(CreateStreamOnHGlobal(
hMem, // NULL, // hGlobal
FALSE, // TRUE, // fDeleteOnRelease
&pstm));
#if DEBUG
// cbSize = GlobalSize(hMem);
#endif // DEBUG
// reset stream seek pointer
LISet32(li, 0);
IfFailGo(pstm->Seek(li, STREAM_SEEK_SET, NULL));
#if DEBUG
STATSTG statstg;
IfFailGo(pstm->Stat(&statstg, STATFLAG_NONAME));
// cbSize = GlobalSize(hMem);
// ASSERT(cbSize >= cbBody, L"stream not big enough...");
#endif // DEBUG
#if 0
ULARGE_INTEGER ulibSize;
// set stream size
ULISet32(ulibSize, cbBody);
IfFailGo(pstm->SetSize(ulibSize));
ULONG cbWritten;
// write bytes to stream
IfFailGo(pstm->Write((void const*)pvBody,
cbBody,
&cbWritten));
ASSERT(cbBody == cbWritten, L"not all bytes written.");
// reset stream seek pointer
LISet32(li, 0);
IfFailGo(pstm->Seek(li, STREAM_SEEK_SET, NULL));
#endif // 0
*ppstm = pstm;
return hresult;
Error:
RELEASE(pstm);
return hresult;
#endif // not yet implemented
return E_NOTIMPL;
}
//=--------------------------------------------------------------------------=
// CMSMQMessage::GetStorageOfBody
//=--------------------------------------------------------------------------=
// Sets message body
//
// Parameters:
// cbBody [in] body length
// pvBody [in] pointer to body buffer
// hMem [in] handle to body buffer
// ppstg [out] pointer to storage inited with buffer
//
// Output:
//
// Notes:
//
HRESULT CMSMQMessage::GetStorageOfBody(
ULONG cbBody,
void *pvBody,
// HGLOBAL hMem,
IStorage **ppstg)
{
#if 0 // not yet implemented
HRESULT hresult;
ULARGE_INTEGER ulibSize;
ILockBytes *plockbytes = NULL;
IStorage *pstg = NULL;
// pessimism
*ppstg = NULL;
HGLOBAL hMem = GlobalHandle(pvBody);
ASSERT(hMem, L"bad handle.");
// have to create and init ILockBytes before stg creation
IfFailRet(CreateILockBytesOnHGlobal(
hMem, // NULL, // hGlobal
FALSE, // TRUE, // fDeleteOnRelease
&plockbytes));
// set ILockBytes size
ULISet32(ulibSize, cbBody);
IfFailGo(plockbytes->SetSize(ulibSize));
#if 0
// write bytes to ILockBytes
ULONG cbWritten;
ULARGE_INTEGER uliOffset;
ULISet32(uliOffset, 0);
IfFailGo(plockbytes->WriteAt(
uliOffset,
(void const *)pvBody,
cbBody,
&cbWritten));
ASSERT(cbBody == cbWritten, L"not all bytes written.");
#endif // 0
hresult = StgOpenStorageOnILockBytes(
plockbytes,
NULL, // pstPriority
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
NULL, // SNB
0, //Reserved; must be zero
&pstg);
//
// 1415: map FILEALREADYEXISTS to E_INVALIDARG
// OLE returns former when bytearray exists (as it does
// since we just created one) but the contents aren't
// a storage -- e.g. when the message buffer isn't an
// object.
//
if (hresult == STG_E_FILEALREADYEXISTS) {
IfFailGo(hresult = E_INVALIDARG);
}
#if DEBUG
STATSTG statstg, statstg2;
IfFailGo(pstg->Stat(&statstg2, STATFLAG_NONAME));
IfFailGo(plockbytes->Stat(&statstg, STATFLAG_NONAME));
#endif // DEBUG
*ppstg = pstg;
RELEASE(plockbytes);
return hresult;
Error:
RELEASE(plockbytes);
RELEASE(pstg);
return hresult;
#endif // not yet implemented
return E_NOTIMPL;
}
//=--------------------------------------------------------------------------=
// CMSMQMessage::get_lenBody
//=--------------------------------------------------------------------------=
// Gets message body len
//
// Parameters:
// pcbBody - [out] pointer to message body len
//
// Output:
//
// Notes:
//
HRESULT CMSMQMessage::get_BodyLength(long *pcbBody)
{
*pcbBody = m_cbBody;
return NOERROR;
}
//=--------------------------------------------------------------------------=
// CMSMQMessage::get_Body
//=--------------------------------------------------------------------------=
// Gets message body
//
// Parameters:
// pvarBody - [out] pointer to message body
//
// Output:
//
// Notes:
//
HRESULT CMSMQMessage::get_Body(VARIANT FAR* pvarBody)
{
HRESULT hresult = NOERROR;
//
// inspect PROPID_M_BODY_TYPE to learn how
// to interpret message
//
if (m_vtBody & VT_ARRAY) {
hresult = GetBinBody(pvarBody);
}
else if (m_vtBody == VT_STREAMED_OBJECT) {
#if 0 // not implemented...yet?
hresult = GetStreamedObject(pvarBody);
#else
hresult = E_NOTIMPL;
#endif
}
else if (m_vtBody == VT_STORED_OBJECT) {
#if 0 // not implemented...yet?
hresult = GetStoredObject(pvarBody);
#else
hresult = E_NOTIMPL;
#endif
}
else {
hresult = GetVarBody(pvarBody);
}
return CreateErrorHelper(hresult, m_ObjectType);
}
//=--------------------------------------------------------------------------=
// CMSMQMessage::GetBinBody
//=--------------------------------------------------------------------------=
// Gets binary message body
//
// Parameters:
// pvarBody - [out] pointer to binary message body
//
// Output:
//
// Notes:
// produces a 1D array of BYTEs in a variant.
//
HRESULT CMSMQMessage::GetBinBody(VARIANT FAR* pvarBody)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
long rgIndices[1];
long i;
HRESULT hresult = NOERROR, hresult2 = NOERROR;
ASSERT(pvarBody, L"bad variant.");
VariantClear(pvarBody);
// create a 1D byte array
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_cbBody;
IfNullRet(psa = SafeArrayCreate(VT_UI1, 1, rgsabound));
// if (m_pbBody) {
if (m_hMem) {
ASSERT(m_pbBody, L"should have pointer to body.");
ASSERT(m_hMem == GlobalHandle(m_pbBody),
L"bad handle.");
//
// now copy array
//
// BYTE *pbBody;
// IfNullFail(pbBody = (BYTE *)GlobalLock(m_hMem));
for (i = 0; i < m_cbBody; i++) {
rgIndices[0] = i;
IfFailGo(SafeArrayPutElement(psa, rgIndices, (VOID *)&m_pbBody[i]));
// IfFailGo(SafeArrayPutElement(psa, rgIndices, (VOID *)&pbBody[i]));
}
}
// set variant to reference safearray of bytes
V_VT(pvarBody) = VT_ARRAY | VT_UI1;
pvarBody->parray = psa;
GLOBALUNLOCK(m_hMem);
return hresult;
Error:
hresult2 = SafeArrayDestroy(psa);
if (FAILED(hresult2)) {
return CreateErrorHelper(
hresult2,
m_ObjectType);
}
GLOBALUNLOCK(m_hMem);
return CreateErrorHelper(
hresult,
m_ObjectType);
}
//=--------------------------------------------------------------------------=
// CMSMQMessage::put_Body
//=--------------------------------------------------------------------------=
// Sets message body
//
// Parameters:
// varBody - [in] message body
//
// Output:
//
// Notes:
//
HRESULT CMSMQMessage::put_Body(VARIANT varBody)
{
VARTYPE vtBody = varBody.vt;
HRESULT hresult = NOERROR;
if ((vtBody & VT_ARRAY) ||
(vtBody == VT_UNKNOWN) ||
(vtBody == VT_DISPATCH)) {
#if 1 // not yet implemented
hresult = PutBinBody(varBody);
#else
hresult = E_NOTIMPL;
#endif
}
else {
hresult = PutVarBody(varBody);
}
return CreateErrorHelper(
hresult,
m_ObjectType);
}
//=--------------------------------------------------------------------------=
// CMSMQMessage::PutVarBody
//=--------------------------------------------------------------------------=
// Sets message body
//
// Parameters:
// varBody [in]
//
// Output:
//
// Notes:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -