我在MicroFocus Cobol中创建了这个safearray(用于传递给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-numw-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吗?如果是这样,如何正确使用VT_VARIANT的safearray?而且我还将这个数组返回给COBOL。

最佳答案

VT_BSTR是Unicode字符串。因此,我希望您在安全数组上调用的方法将pic x(..)转换为Unicode BSTR。它将仅使用PIC N缓冲区并将其转换。

如果您将这些字符作为sbcs(单字节字符集),则应将其作为字符串通过,并在此过程中转换为BSTR。

如果使用N“”国家文字,那么请确保使用NSYMBOL“ NATIONAL”指令,否则系统可以解释为DBCS Literal。

关于c# - 将safearray中的PIC N(n)传递给COM对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56808396/

10-14 16:46