1 为什么引入BSTR数据类型?
COM入门到精通一书描述:要使COM对象能被VBSCRIPT这类客户访问就要使用一些AUTOMATION定义的数据类型(BSTR就是其中一种)
不使用BSTR为什么就不能访问呢?2 如何使用BSTR类型数据编写一访问控制器(检查特定的用户是否有权限访问特定的函数):
使用ATL生成项目,添加一Simple Object,取名AccessControl,IDE生成IAccessControl接口,在此接口上添加IsAllowed方法,函数原型如下:STDMETHODIMP CAccessControl::IsAllowed(BSTR UserName, short ReqFunction, VARIANT_BOOL *pbIsAllowed)
{
// TODO: Add your implementation code here
BSTR bstrUserName = SysAllocString(L"BadBoy");
if (UserName == bstrUserName)
*pbIsAllowed = VARIANT_TRUE;
else
*pbIsAllowed = VARIANT_FALSE;
return S_OK;
}
UserName传入用户名,ReqFunction传入要请求的函数,*pbIsAllowed返回是否能访问
要实现功能:若用户名UserName等于BadBoy则可以访问任何函数。
现不明白BSTR如何使用,以上功能如何编写3 书中描述:指定BSTR必须先设置字符数在指定字符。这是什么意思?API函数SysAllocString 和SysFreeString如何工作?
ATL提供CComBSTR类来封装BSTR,这个先不管,我现在是学习,弄清内部操作是现在的目标
COM入门到精通一书描述:要使COM对象能被VBSCRIPT这类客户访问就要使用一些AUTOMATION定义的数据类型(BSTR就是其中一种)
不使用BSTR为什么就不能访问呢?2 如何使用BSTR类型数据编写一访问控制器(检查特定的用户是否有权限访问特定的函数):
使用ATL生成项目,添加一Simple Object,取名AccessControl,IDE生成IAccessControl接口,在此接口上添加IsAllowed方法,函数原型如下:STDMETHODIMP CAccessControl::IsAllowed(BSTR UserName, short ReqFunction, VARIANT_BOOL *pbIsAllowed)
{
// TODO: Add your implementation code here
BSTR bstrUserName = SysAllocString(L"BadBoy");
if (UserName == bstrUserName)
*pbIsAllowed = VARIANT_TRUE;
else
*pbIsAllowed = VARIANT_FALSE;
return S_OK;
}
UserName传入用户名,ReqFunction传入要请求的函数,*pbIsAllowed返回是否能访问
要实现功能:若用户名UserName等于BadBoy则可以访问任何函数。
现不明白BSTR如何使用,以上功能如何编写3 书中描述:指定BSTR必须先设置字符数在指定字符。这是什么意思?API函数SysAllocString 和SysFreeString如何工作?
ATL提供CComBSTR类来封装BSTR,这个先不管,我现在是学习,弄清内部操作是现在的目标
用wcscmp()函数进行比较;
看一下MSDN的相关章节
2.可以用_bstr_t
-------------------
| | |s |t |r |\0|
-------------------
^
|
BSTR
所以用SysAllocString分配内存里先放入字符串长度后,再写入字符串,并返回字符串的开始地址。当然这里的字符都是宽字符(wchar_t)。
顺便也问一下:
要调用API函数的时候,BSTR和LPSTR怎么转换?
1 对于[in]属性的参数要客户端分配空间;
例如:上面的UserName应在客户端分配空间。然后客户端释放空间。
LPSTR ss = "wwww";
BSTR uName = SysAllocString( T2OLE( ss ) );
。
SysFreeString( uName );
2对于[out]属性的,在com内分配空间。客户端释放。