Ole Error 80020003: Voice: Член группы не найден

отредактировано 17:23 Раздел: FastReport 4.0
Windows XP, Delphi 5, FR 4 EE, FS 1.100

Добрый день!

Создал тикет в поддержке, но к сожалению молчек. В таком вот коде возникает ошибка
var 
  Client : variant; 
  Voices : variant; 
begin 
  Client := CreateOleObject('SAPI.SpVoice.1'); 
  try 
    Voices := Client.GetVoices('','');
    Client.Voice := Voices.Item(1); // Вот тут появляется ошибка - OLE error 80020003: Voice: Член группы не найден 
    Client.Speak('are you ok?', 1); 
    ShowMessage('1'); 
  finally 
    Voices := Null; 
    Client := Null; 
  end; 
end.

Тот же пример в Delphi работает на ура. Помогите разобраться, может кто сталкивался?

Комментарии

  • отредактировано 17:23
    Помогли разобраться с поддержки, большое спасибо! Скрипт не умеет обрабатывать свойства OLE объектов содержащие ссылки, необходимо внести изменения в fs_idisp.pas
    function TfsOLEHelper.DispatchInvoke(const ParamArray: Variant; ParamCount: Integer;
      Flags: Word): Variant;
    const
      DispIDArgs: Longint = DISPID_PROPERTYPUT;
    var
      DispId: TDispId;
      Params: TDISPPARAMS;
      pName: WideString;
      ExcepMess: WideString;
      Args: array[0..63] of Variant;
      i: Integer;
      PResult: PVariant;
      Status: Integer;
      ExcepInfo: TExcepInfo;
    begin
      ExcepMess := '';
      pName := WideString(Name);
      IDispatch(ParentValue).GetIDsOfNames(GUID_NULL, @pName, 1, GetThreadLocale, @DispId);
    
      for i := 0 to ParamCount - 1 do
        Args[i] := ParamArray[ParamCount - i - 1];
    
      Params.rgvarg := @Args;
      Params.rgdispidNamedArgs := nil;
      Params.cArgs := ParamCount;
      Params.cNamedArgs := 0;
      if (Flags = DISPATCH_PROPERTYPUT) or (Flags = DISPATCH_PROPERTYPUTREF) then
      begin
        Params.rgdispidNamedArgs := @DispIDArgs;
        Params.cNamedArgs := 1;
      end;
    
      if NeedResult and (Flags <> DISPATCH_PROPERTYPUT) and (Flags <> DISPATCH_PROPERTYPUTREF) then
        PResult := @Result else
        PResult := nil;
      if PResult <> nil then
        VarClear(PResult^);
      if (Flags = DISPATCH_METHOD) {and (ParamCount = 0)} and (PResult <> nil) then
        Flags := DISPATCH_METHOD or DISPATCH_PROPERTYGET;
    
      Status := IDispatch(ParentValue).Invoke(DispId, GUID_NULL, 0,
        Flags, Params, PResult, @ExcepInfo, nil);
      if Status <> 0 then
      begin
        if ExcepInfo.bstrSource <> '' then
          ExcepMess := #13+#10 + 'Source        ::  '+ ExcepInfo.bstrSource;
        if ExcepInfo.bstrDescription <> '' then
          ExcepMess := ExcepMess + #13#10 + 'Description ::  '+ ExcepInfo.bstrDescription;
        if ExcepInfo.bstrHelpFile <> '' then
          ExcepMess := ExcepMess + #13#10 + 'Help File     ::  '+ ExcepInfo.bstrHelpFile;
    {$IFDEF Delphi12}
        raise Exception.Create('OLE error ' + IntToHex(Status, 8) + ': ' +
          String(Name) + ': ' + SysErrorMessage(Status) + ExcepMess);
    {$ELSE}
        raise Exception.Create('OLE error ' + IntToHex(Status, 8) + ': ' +
          Name + ': ' + SysErrorMessage(Status) + ExcepMess);
    {$ENDIF}
      end;
    end;
    
    procedure TfsOLEHelper.SetValue(const Value: Variant);
    var
      i: Integer;
      v: Variant;
      Flag: Word;
    begin
      v := VarArrayCreate([0, Count], varVariant);
      for i := 0 to Count - 1 do
        v[i] := Params[i].Value;
      v[Count] := Value;
      Flag := DISPATCH_PROPERTYPUT;
      if VarType(Value) = varDispatch then
        Flag := DISPATCH_PROPERTYPUTREF;
      DispatchInvoke(v, Count + 1, Flag);
    end;
    

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.