我在ActiveForm里面添加了一个事件OnCall,参数为BSTR类型,
然后添加了一个Button,当单击Button的时候引发OnCall事件,
我传了一个String进去.
在JavaScript中我用一个简单的显示事件参数的函数来实现这个事件的回调.
结果运行时点击Button提示
"Access violation at......".
高手们指教啊

解决方案 »

  1.   

    建议用WideString,双字节,或者使用VARIANT
      

  2.   

    (1)BSTR类型是COM中使用的标准字符串类型。它其实是一个32位指针,保存字符串首字符的地址。既然是指针类型,好的习惯应该是在定义一个BSTR类型变量时立刻初始化为NULL,即使随后立刻就会对其进行赋值。
        (2)pLastNode->get_text(BSTR* pstrText)方法内部为返回的字符串分配了内存资源,并将该字符串的地址bsName变量中。
        (3)外部使用者pLastNode->get_text方法的调用者必须自己调用SysFreeString(BSTR bstr)方法释放BSTR类型字符串占用的资源。
        MSDN中用关于BSTR和其他字符串类型的更详细的叙述。
      

  3.   

    跟OnCall有关的定义:
    procedure OnCall(const Param1: WideString); dispid 209;
    TActiveFormXOnCall = procedure(ASender: TObject; const Param1: WideString) of object;
    FOnCall: TActiveFormXOnCall;
    property OnCall: TActiveFormXOnCall read FOnCall write FOnCall;procedure TActiveFormX.Button1Click(Sender: TObject);
    var
      msg: WideString;
    begin
      msg:='测试';
      self.FEvents.OnCall(msg);
    end;
    一点击这个按钮就出错。