Передайте PIC N (n) в Safearray COM-объекту. - PullRequest
2 голосов
/ 28 июня 2019

Я создаю этот защищенный массив в MicroFocus Cobol (для передачи в COM-объект):

           move VT-BSTR to w-vartype
           move 1 to w-dimension
           compute w-y = a-x * 2
           move w-y to cElements of w-saBound(1)
           move 0 to llBound of w-saBound(1)
           invoke OLESafeArray "new"
            using by value w-vartype w-dimension
            by reference w-saBound(1)
            returning w-accArray
           end-invoke
           move a-x to cElements of w-saBound(1)
           invoke OLESafeArray "new"
            using by value w-vartype w-dimension
            by reference w-saBound(1)
            returning w-modArray
           end-invoke

           initialize w-x
           perform varying w-Index from 0 by 1 until w-Index >= w-y
             add 1 to w-x
             move n'aaa' to acc-bank-acc-num
             invoke w-accArray "putString"
              using by reference w-Index
                    by value 68
                    by reference w-acc-num(w-x)
              returning w-hresult
             end-invoke
             add 1 to w-Index
             invoke w-accArray "putString"
              using by reference w-Index
                    by value 68
                    by reference w-acc-result(w-x)
              returning w-hresult
             end-invoke
           end-perform

           perform varying w-Index from 0 by 1 until w-Index >= a-x
             invoke w-modArray "putString"
              using by reference w-Index
                    by value 4
                    by reference w-acc-mod(w-Index + 1)
              returning w-hresult
             end-invoke
           end-perform

Когда я передаю PIC X(n) переменных (в примере w-acc-num, w-acc-result и т. Д.)все отлично.Но мне нужно обрабатывать строки Unicode, поэтому тип данных должен быть PIC N(n).И тогда результат в COM-объекте (.NET C #) плох, например, так:

  • Я отправляю: "1072907036"
  • Но в COM-объекте я получаю: "1\ 00 \ 07 \ 02 \ 09 \ 00 \ 07 \ 00 \ 03 \ 06 \ 0 "

Полагаю, проблема в типе VT_BSTR. Стоит ли использовать VT_VARIANT вместо этого?И если это так, то как правильно использовать safearray из VT_VARIANT s?И я также возвращаю этот массив обратно в COBOL.

1 Ответ

1 голос
/ 28 июня 2019

VT_BSTR является строкой Unicode. Поэтому я ожидал бы, что методы, которые вы вызываете в безопасном массиве, преобразуют pic x (..) в Unicode BSTR. Он просто возьмет PIC N Buffer и преобразует его.

Если у вас есть эти символы в виде sbcs (однобайтовой кодировки), тогда они должны быть представлены в виде строки и преобразованы в BSTR.

При использовании N "" национальных литералов убедитесь, что вы используете директиву NSYMBOL "NATIONAL", иначе система может быть интерпретирована как литерал DBCS.

...