[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
#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)。
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
#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)。
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)。