在带有BSTR的结构体上执行memset

本文关键字:执行 memset 结构体 BSTR | 更新日期: 2023-09-27 18:02:29

我目前有一个堆损坏,导致我的应用程序崩溃。我的应用程序是COM服务器(c++)编组到c#客户端应用程序。它看起来像一个SysFreeString可能从c#端作为COM清理的一部分被调用。我似乎无法确定原因,但是否有可能在c++方面对具有BSTR的结构进行memset 0导致问题?

以下内容有效吗?

memset(pResult, 0, sizeof(RESULT)) where pResult is of type RESULT
typedef struct _Result
{
    DWORD dwResult;
    BSTR strData;
}   RESULT;

STACK_TEXT from WinDbg:

<>之前00000000 ' 77a7bc35 ntdll!?? :: FNODOBFM:: + 0 xea19"字符串"00000000 ' 77b4b520 ' 000007fe ' ffc41377 oleaut32!SysFreeString + 0 x5300000000 ' 77b4b528 000007fe ' ffc46b2e oleaut32!BSTR_UserFree + 0 x1e000007fe ' fe354a1c rpcr4 !NdrUserMarshalFree + 0 x4c00000000 ' 77b4b538 000007fe ' fe3566eb rpcr4 !NdrpFreeParams + 0 x20700000000 ' 77b4b540 000007fe ' fe365362 rpcr4 !NdrStubCall2 + 0 xedc00000000 ' 77b4b548 ' 000007fe ' fe84f16e ole32!CStdStubBuffer_Invoke + 0 x8b000007fe ' fe850ccd ole32!SyncStubInvoke + 0 x5d00000000 ' 77b4b558 ' 000007fe ' fe850c43 ole32!StubInvoke + 0 xdb000007fe ' fe70a4f0 ole32!x190 CCtxComChnl: ContextInvoke + 000000000 ' 77b4b568 000007fe ' fe8514d6 ole32!AppInvoke + 0 xc200000000 ' 77b4b570 ' 000007fe ' fe85122b ole32!ComInvokeWithLockAndIPID + 0 x52b00000000 ' 77b4b578 000007fe ' fe84fd6d ole32!ThreadInvoke + 0 x30d00000000 ' 77b4b580 ' 000007fe ' fe363254 rpcr4 !DispatchToStubInCNoAvrf + 0 x1400000000 ' 77b4b588 000007fe ' fe3633b6 rpcr4 !RPC_INTERFACE: DispatchToStubWorker + 0来000007fe ' fe365b8b rpcr4 !x9b RPC_INTERFACE: DispatchToStub + 000000000 ' 77b4b598 000007fe ' fe365ach rpcr4 !x5b RPC_INTERFACE: DispatchToStubWithObject + 000000000 ' 77b4b5a0 000007fe ' fe365a62 rpcr4 !x422 LRPC_SCALL: DispatchRequest + 000000000 ' 77b4b5a8 000007fe ' fe36375d rpcr4 !LRPC_SCALL: HandleRequest x20d + 0000000007fe ' fe3809ff rpcr4 !x3bf LRPC_ADDRESS: ProcessIO + 000000000 ' 77b4b5b8 000007fe ' fe3805b5 rpcr4 !LrpcIoComplete + 0 xa500000000 ' 77a2b6bb ntdll!TppAlpcpExecuteCallback + 0 x26b00000000 ' 77a2ff2f ntdll!TppWorkerThread + 0 x3f800000000 ' 7790652d内核32!BaseThreadInitThunk + 0 xd00000000 ' 77a3c541 ntdll!RtlUserThreadStart + 0 x1d

在带有BSTR的结构体上执行memset

是否有可能在c++一侧对具有BSTR的结构进行memset 0导致问题?

不,BSTR是一个指针类型(typedef OLECHAR *BSTR;),所以用memset清除它的值最多会导致内存泄漏,但不会导致崩溃。

自从我弄乱了这个东西已经有一段时间了,但我认为BSTR是一个令人讨厌的地方,wchar_t *指针不指向缓冲区的开始。SysFreeString()实际上会释放(ptr-1)或类似的东西。用memset()将其归零听起来是个坏主意。

如果异常出现在COM清理代码中。当然,这个结果结构的分配存在问题。

请确保:

如何将参数传递给函数

In Parameter =>如果这个参数作为In Parameter传递,那么它是由客户端分配的,你不能重新分配这个参数,否则你会得到这个异常。

InOut Parameter =>如果该参数为InOut Parameter,则可以重新分配该参数。