VB6 имеет три случая объявления строковых параметров - ByVal param As String
, ByRef param As String
и Function() As String
. Первый в IDL соответствует [in] BSTR param
, второй - [in, out] BSTR *param
, третий - [out, retval] BSTR *retval
.
Нет никакого способа, которым VB6 может объявлять параметры [in] BSTR *
или [out] BSTR *
, но он все еще может использовать их, то есть он может вызывать методы (в VC), класс которых имеет параметры, объявленные как out-only, или любой другой поддерживаемый IDL способ .
Также обратите внимание, что BSTR
сам по себе является указателем typedef, что-то вроде wchar_t *
, поэтому BSTR *
на самом деле wchar **
. IDL нужен указатель для наших параметров, поэтому вы не можете объявить [out] int param
, а [out] BSTR param
также странно.
Как только [in] BSTR *
путаница становится ясной (это ненужная странная двойная косвенность, необходимая для out-параметров, но не только для ввода), простое правило состоит в том, что, когда у вас есть * в объявлении param, вызывающий должен освободить его после вызов метода, если он уже не равен NULL.
[in, out] SAFEARRAY(BSTR)* pArray
отображается на ByRef pArray() As String
в VB6, и вы не можете изменить это значение на ByVal
, т. Е. * Требуется для VB6, поэтому он не может быть только-только, и вызывающая сторона должна освободить безопасный массив. Это не единственный безопасный массив.