vb调用com组件中的方法,以传出字符串数据,类型不匹配的问题

时间:2021-10-25 00:21:31
我在vc写的com组件里实现了 以下方法
[id(2), helpstring("方法GetVersionString")] HRESULT GetVersionString([out]BSTR* strVersion);

然后在vb代码里面这样调用:
      Dim myObj As Object
        Dim copy As String
        myObj = CreateObject("HardLevelCom.HardControl")
        myObj.getVersionString(copy)
但这样子写老是报错 说类型不匹配,该如何在vb里向com传值?

2 个解决方案

#1


该回复于2011-11-21 13:01:33被版主删除

#2


vb调用方法 没有错,错在vc里没有正确处理BSTR*数据


BSTR(Basic STRing)实际上是类Pascal字符串,在BSTR的前4个字节保存了字符串长度,所以BSTR内部可以包括\0,它也不是靠\0来判断字符串结尾 的。BSTR在c/c++中的定义实际上是wchar_t*,但因为BSTR是依靠前4个字节来判断字符串长度的,所以它的分配和释放都不同于普通的字符 串,需要通过::SysAllocString和::SysFreeString等函数来分配和释放。
Com的接口中要使用字符串的话必须使用BSTR类型,传个参数可以直接使用BSTR,传出参数则要使用BSTR*,也就是一个wchar_t的双重指 针,它的作法其它是传递一个双重指针进来,由Com内部分配空间,并通过这个二级指针传递给客户程序,所以客户程序要负责释放这段空间(如果用户传进来的 指针已经包含分配过的字符串,则在Com内部首先要释放原有的空间,然后再新分配一个返回,否则会有内存泄露),比如,假如接口里传入一个参数 BSTR* sAnswers,则需要首先:
if (*sAnswers != NULL)
{
    ::SysFreeString(*sAnswers);
    *sAnswers = NULL;
}
这个功能执行完要返回时再使用*sAnswers = ::SysAllocString(L"return value")分配一个新的字符串返回给客户。
客户调用时,如果需要通过这个BSTR*传值给Com,也必须使用::SysAllocString申请一段空间,然后把指针传进去,而不能使用局部变量 (因为Com内部一般会首先释放这段空间,如果这个局部变量被Com释放,那它离开作用域的时候再自动析构可能就会出错),如果不需要传值进去(只作为接 受返回值使用),则可以定义一个空的BSTR值(一般初始化为NULL,因为它也是一个指针)传入。不论是否传入值,经过Com接口传出的BSTR 都必须由客户来释放(使用::SysFreeString)。

#1


该回复于2011-11-21 13:01:33被版主删除

#2


vb调用方法 没有错,错在vc里没有正确处理BSTR*数据


BSTR(Basic STRing)实际上是类Pascal字符串,在BSTR的前4个字节保存了字符串长度,所以BSTR内部可以包括\0,它也不是靠\0来判断字符串结尾 的。BSTR在c/c++中的定义实际上是wchar_t*,但因为BSTR是依靠前4个字节来判断字符串长度的,所以它的分配和释放都不同于普通的字符 串,需要通过::SysAllocString和::SysFreeString等函数来分配和释放。
Com的接口中要使用字符串的话必须使用BSTR类型,传个参数可以直接使用BSTR,传出参数则要使用BSTR*,也就是一个wchar_t的双重指 针,它的作法其它是传递一个双重指针进来,由Com内部分配空间,并通过这个二级指针传递给客户程序,所以客户程序要负责释放这段空间(如果用户传进来的 指针已经包含分配过的字符串,则在Com内部首先要释放原有的空间,然后再新分配一个返回,否则会有内存泄露),比如,假如接口里传入一个参数 BSTR* sAnswers,则需要首先:
if (*sAnswers != NULL)
{
    ::SysFreeString(*sAnswers);
    *sAnswers = NULL;
}
这个功能执行完要返回时再使用*sAnswers = ::SysAllocString(L"return value")分配一个新的字符串返回给客户。
客户调用时,如果需要通过这个BSTR*传值给Com,也必须使用::SysAllocString申请一段空间,然后把指针传进去,而不能使用局部变量 (因为Com内部一般会首先释放这段空间,如果这个局部变量被Com释放,那它离开作用域的时候再自动析构可能就会出错),如果不需要传值进去(只作为接 受返回值使用),则可以定义一个空的BSTR值(一般初始化为NULL,因为它也是一个指针)传入。不论是否传入值,经过Com接口传出的BSTR 都必须由客户来释放(使用::SysFreeString)。