我是一个有用的助手,可以翻译文本。
我有一个用C++编写的进程外COM服务器,由一些C#客户端代码调用。服务器接口中的一个方法向客户端返回一个大型BSTR,我怀疑这会导致内存泄漏。代码可以运行,但我正在寻求有关编组BSTR的帮助。
简化一下,服务器方法的IDL为:
A2BSTR 在内部使用 SysAllocStringLen() 分配 BSTR。
在 C# 客户端中,我只需执行以下操作:
这个程序可以工作,因为请求字符串被发送到COM服务器并且正确的响应字符串被返回给C#客户端。但是每次与服务器的往返都会在服务器进程中泄漏内存。crt泄漏检测支持显示在crt堆上没有重大泄漏,因此我怀疑泄漏是使用IMalloc分配的。
我有一个用C++编写的进程外COM服务器,由一些C#客户端代码调用。服务器接口中的一个方法向客户端返回一个大型BSTR,我怀疑这会导致内存泄漏。代码可以运行,但我正在寻求有关编组BSTR的帮助。
简化一下,服务器方法的IDL为:
HRESULT ProcessRequest([in] BSTR request, [out] BSTR* pResponse);
实现看起来像:
HRESULT MyClass::ProcessRequest(BSTR request, BSTR* pResponse)
{
USES_CONVERSION;
char* pszRequest = OLE2A(request);
char* pszResponse = BuildResponse(pszRequest);
delete pszRequest;
*pResponse = A2BSTR(pszResponse);
delete pszResponse;
return S_OK;
}
A2BSTR 在内部使用 SysAllocStringLen() 分配 BSTR。
在 C# 客户端中,我只需执行以下操作:
string request = "something";
string response = "";
myserver.ProcessRequest(request, out response);
DoSomething(response);
这个程序可以工作,因为请求字符串被发送到COM服务器并且正确的响应字符串被返回给C#客户端。但是每次与服务器的往返都会在服务器进程中泄漏内存。crt泄漏检测支持显示在crt堆上没有重大泄漏,因此我怀疑泄漏是使用IMalloc分配的。
我做错了什么吗?我发现模糊的评论说“所有输出参数必须使用CoTaskMemAlloc分配,否则互操作编组程序将不会释放它们”,但没有详细信息。
安迪