02.11.2005 19:57:06Передача бинарных параметров функции Submit Ответов: 3
Николай
Уважаемые Господа!

Возможно, мой вопрос не в тему, но я бьюсь с ним уже довольно долго и никак не могу найти решение.

Если функции Submit COM-интерфейса ICertRequest2 передать в качестве значения ее второго параметра (тип этого параметра BSTR) данные, содержащие всередине два идущих подряд нулевых двоичных байта (признак конца строки), она получает это значение полностью, т.е. признак конца строки игнорируется, а для определения длины параметра используется его длина, находящаяся в первых четырех байтах этого параметра.
Аналогичной функции моего COM-объекта, разработанного с помощью VC++ ATL COM Wizard, это же значение передается урезанным, т.е. ситуация повторяется с точностью наоборот: фактическая длина параметра, находящаяся в первых четырех его байтах игнорируется, а рабочая длина определяется по месту нахождения признака конца строки. В результате функция при обработке этого параметра выдает ошибку.
Что интересно, при использовании моего COM-объекта эта ситуация наблюдается только в случае взаимодействия с клиентом, написанным на VC++. Если же использовать клиент на Visual Basic или скриптовый клиент, все работает нормально. Что касается функции Submit, то ей фиолетово, кто ее вызывает. В любом случае на ее вход попадают правильные, а не урезанные данные.

Вопрос: каким образом на вход функции Submit попадают правильные данные, т.е. как я должен переделать свой COM-объект, чтобы он работал точно так же, как и COM-интерфейс ICertRequest2.

Пожалуйста, если кто знает решение этой проблемы, поделитесь опытом.

Николай
 
Ответы:
03.11.2005 13:26:58Kirill Sobolev
Попробуйте для определения фактической длины воспользоваться SysStringByteLen.
03.11.2005 15:31:13Николай
Дело не в том, какую функцию использовать для определения длины параметра, а в том, что на входе моей функции значение этого параметра уже обрезано. Что нужно сделать для того, чтобы это значение не обрезалось?

Николай
04.11.2005 13:04:24Николай
Привожу простой пример на С++:

byte request[] = {1, 0, 0, 0, 2, 3, 4};
BSTR str1 = SysAllocStringByteLen((const char *)request, sizeof(request));
BSTR str2 = _bstr_t(SysAllocStringByteLen((const char *)request, sizeof(request)));

Если выполнить этот фрагмент кода, то можно увидеть, что в переменной str1 находится правильное значение, а в переменной str2 - обрезанное.
Мой VC++-клиент как раз и использует конструкторы класса _bstr_t во время передачи параметров функции моего COM-объекта, построенного с помощью VC++ ATL COM AppWizard’а.
Каким образом клиенты, обращающиеся к функции Submit, не используют эти конструкторы?