我必须编写一个由旧(闭源)VB6 应用程序的插件接口调用的 COM 服务器 DLL(使用 ATL),并且希望避免可能的泄漏(当然)!接口描述按原样给出,遗憾的是无法更改:
将被调用的类方法在 VB 端声明如下:
Public Function Process(data As Object,
Params As Variant,
Results() As Single) As Integer
IDL 中的接口声明如下:
[id(1)] HRESULT Process([in,out] IDispatch** pDataIDisp,
[in,out] VARIANT* pParamsVar,
[in,out] SAFEARRAY(FLOAT)* pResSA,
[out,retval] SHORT* pRetVal);
最后被调用的代码如下所示:
STDMETHODIMP Analyzer::Process(IDispatch** pDataIDisp,
VARIANT* pParamsVar,
SAFEARRAY** pResSA,
SHORT* pRetVal)
{
try
{
// Prepare for access
CComPtr<IDispatch> dataComPtr = *pDataIDisp;
// VARTYPE from caller is VT_VARIANT | VT_ARRAY | VT_BYREF;
CComVariant prms = *pParamsVar; // OR use .Attach ?
CComSafeArray<VARIANT> prmsArr = prms.parray; // OR use prms.Attach ?
// SafeArray is FADF_HAVEVARTYPE
CComSafeArray<FLOAT> res = *pResSA; // OR use res.Attach(pResSA*) ?
{
// Use ATL types wrapped from above
}
// Cleanup ????
.
.
.
}
catch (...) {}
return S_OK;
}
我想知道的是:
我接受(和转换)参数为 ATL 类型的方法是正确的用法还是有另一种(更好的?)方法?
我是否必须自己在 IDispatch* 上调用 AddRef() 和/或 Release(),或者分配给 CComPtr 来完成这一切是否足够?
作为 VT_BYREF 给出的第二个参数的含义是什么?
头文件说:
* VT_VARIANT [V][T][P][S] VARIANT * * VT_ARRAY [V] SAFEARRAY* * VT_BYREF [V] void* for local use
我不清楚……#-o
在存储在 VARIANT(第二个参数)中的 SAFEARRAY 上使用 SafeArray(Un)AccessData 是否足够?
为了让这个东西正常工作(健壮),还有什么额外的事情需要考虑吗?
感谢您抽出宝贵的时间并可能帮助我!
ps:我已经得到了这个工作(或多或少)我只想避免我无法调试的问题(LEAKS!),因为调用应用程序是封闭源代码而不是在我的控制之下......