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,这个先不管,我现在是学习,弄清内部操作是现在的目标

解决方案 »

  1.   

    用_bstr_t字符串类型;
    用wcscmp()函数进行比较;
    看一下MSDN的相关章节
      

  2.   

    1.因为VB用的BSTR,BSTR的效率高,他知道长度
    2.可以用_bstr_t
      

  3.   

    BSTR型在其指针前两个字节()放有该字符串长度的值。
    -------------------
    |  |  |s |t |r |\0|
    -------------------
          ^
          |
        BSTR
    所以用SysAllocString分配内存里先放入字符串长度后,再写入字符串,并返回字符串的开始地址。当然这里的字符都是宽字符(wchar_t)。
      

  4.   

    关注
    顺便也问一下:
    要调用API函数的时候,BSTR和LPSTR怎么转换?
      

  5.   

    BSTR 类型是这样使用的:
    1 对于[in]属性的参数要客户端分配空间;
    例如:上面的UserName应在客户端分配空间。然后客户端释放空间。
    LPSTR ss = "wwww";
    BSTR uName = SysAllocString( T2OLE( ss ) );

    SysFreeString( uName );
    2对于[out]属性的,在com内分配空间。客户端释放。