使用BSTR在struct上执行memset

时间:2014-05-08 15:23:54

标签: c# c++ marshalling memset bstr

我目前有一个堆损坏导致我的应用程序崩溃。我的应用程序是COM服务器(C ++)marshalls到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;

来自WinDbg的STACK_TEXT:

00000000`77b4b518 00000000`77a7bc35 ntdll! ?? ::FNODOBFM::`string'+0xea19
00000000`77b4b520 000007fe`ffc41377 oleaut32!SysFreeString+0x53
00000000`77b4b528 000007fe`ffc46b2e oleaut32!BSTR_UserFree+0x1e
00000000`77b4b530 000007fe`fe354a1c rpcrt4!NdrUserMarshalFree+0x4c
00000000`77b4b538 000007fe`fe3566eb rpcrt4!NdrpFreeParams+0x207
00000000`77b4b540 000007fe`fe365362 rpcrt4!NdrStubCall2+0xedc
00000000`77b4b548 000007fe`fe84f16e ole32!CStdStubBuffer_Invoke+0x8b
00000000`77b4b550 000007fe`fe850ccd ole32!SyncStubInvoke+0x5d
00000000`77b4b558 000007fe`fe850c43 ole32!StubInvoke+0xdb
00000000`77b4b560 000007fe`fe70a4f0 ole32!CCtxComChnl::ContextInvoke+0x190
00000000`77b4b568 000007fe`fe8514d6 ole32!AppInvoke+0xc2
00000000`77b4b570 000007fe`fe85122b ole32!ComInvokeWithLockAndIPID+0x52b
00000000`77b4b578 000007fe`fe84fd6d ole32!ThreadInvoke+0x30d
00000000`77b4b580 000007fe`fe363254 rpcrt4!DispatchToStubInCNoAvrf+0x14
00000000`77b4b588 000007fe`fe3633b6 rpcrt4!RPC_INTERFACE::DispatchToStubWorker+0x146
00000000`77b4b590 000007fe`fe365b8b rpcrt4!RPC_INTERFACE::DispatchToStub+0x9b
00000000`77b4b598 000007fe`fe365acb rpcrt4!RPC_INTERFACE::DispatchToStubWithObject+0x5b
00000000`77b4b5a0 000007fe`fe365a62 rpcrt4!LRPC_SCALL::DispatchRequest+0x422
00000000`77b4b5a8 000007fe`fe36375d rpcrt4!LRPC_SCALL::HandleRequest+0x20d
00000000`77b4b5b0 000007fe`fe3809ff rpcrt4!LRPC_ADDRESS::ProcessIO+0x3bf
00000000`77b4b5b8 000007fe`fe3805b5 rpcrt4!LrpcIoComplete+0xa5
00000000`77b4b5c0 00000000`77a2b6bb ntdll!TppAlpcpExecuteCallback+0x26b
00000000`77b4b5c8 00000000`77a2ff2f ntdll!TppWorkerThread+0x3f8
00000000`77b4b5d0 00000000`7790652d kernel32!BaseThreadInitThunk+0xd
00000000`77b4b5d8 00000000`77a3c541 ntdll!RtlUserThreadStart+0x1d

3 个答案:

答案 0 :(得分:0)

  

是否有可能在C ++端对一个有BSTR的结构进行memset 0会导致问题?

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

答案 1 :(得分:0)

自从我搞砸了这些东西已经有一段时间了,但我认为BSTR是一种可憎的行为,wchar_t *指针并不指向缓冲区的开头。 SysFreeString()实际上会释放(ptr-1)或类似的东西。用memset()将其归零听起来像个坏主意。

答案 2 :(得分:0)

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

请确保:

如何将此参数传递给函数

参数 =>如果此参数作为在参数中传递,而不是由客户端分配,并且您无法重新分配此参数,否则您将获得此异常。

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