За последние 24 часа нас посетил 18431 программист и 1606 роботов. Сейчас ищет 941 программист ...

Нужен HELP по COM объектам

Тема в разделе "Прочие вопросы по PHP", создана пользователем borodulin, 20 апр 2007.

  1. borodulin

    borodulin Активный пользователь

    С нами с:
    20 апр 2007
    Сообщения:
    4
    Симпатии:
    0
    Как в PHP сделать передачу (замену) дочернему объекту созданного объекта, другой созданный объект.
    На VB это выглядит так

    Set obj1.subobj=obj2

    Конкретная задача на VB/VBScript

    Set spkStrm =CreateObject("SAPI.SpFileStream")
    Set Voice=CreateObject("SAPI.SpVoice")
    spkStrm.Open filenameForWrite, SSFMCreateForWrite, False
    Set Voice.AudioOutputStream = spkStrm
    Voice.Speak textToSpeech
    spkStrm.Close
    Set spkStrm = Nothing
    Set voice=Nothing

    Пробую на PHP следующий код

    $spkStrm = new COM("SAPI.SpFileStream");
    $voice = new COM("SAPI.SpVoice");
    $spkStrm->Open ($wf, 3, False);
    $voice->AudioOutputStream = $spkStrm;
    $voice->Speak ($spk);
    $spkStrm->Close;
    unset($spkStrm);
    unset($voice);

    Спотыкается на выделенной строке с ошибкой

    Fatal error: Uncaught exception 'com_exception' with message 'Error [0x80020003] Член группы не найден. '

    Следует отметить, что на VB код 100% работает...

    Как мне запустить на PHP?
     
  2. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    borodulin
    точно вспотыкается на строчке " $voice->AudioOutputStream = $spkStrm; "?

    Пишите так:
    $voice->AudioOutputStream = &$spkStrm;
     
  3. borodulin

    borodulin Активный пользователь

    С нами с:
    20 апр 2007
    Сообщения:
    4
    Симпатии:
    0
    точно на этой строке.

    прописал &. Код выдал следующую ошибку:

    Fatal error: Cannot assign by reference to overloaded object in....
     
  4. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    borodulin
    Хм... наверное глюк связан с тем что прицепить пытаетесь к ком объекту...

    Что выводит код?
    Код (Text):
    1.  
    2.  $spkStrm = new COM("SAPI.SpFileStream");
    3. $voice = new COM("SAPI.SpVoice");
    4. $spkStrm->Open ($wf, 3, False);
    5. print (int) isset($voice->AudioOutputStream);
    6. print (int) empty($voice->AudioOutputStream);
    7. $voice->AudioOutputStream=1;
     
  5. borodulin

    borodulin Активный пользователь

    С нами с:
    20 апр 2007
    Сообщения:
    4
    Симпатии:
    0
    10<br />
    <b>Fatal error</b>: Uncaught exception 'com_exception' with message 'Error [0x80020003] Член группы не найден.

    Может поможет, если скажу, что изначально $voice->AudioOutputStream
    имеет количество свойств/функций, отличное от количества в объекте $spkStrm. В объекте $spkStrm на пару свойств больше. Т.е. получается, что по идее нужно подменить старый объект на новый. Как это сделать на PHP незнаю :(

    То, что надо подменять объект - это точно. Изначальный пример брал из Speech SDK. Да и код на VB работает нормально...
     
  6. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Ну вот все ясно :)
    Это значит что данное свойство есть и уже заполнено.
    А учитывая ваш коммент получается там еще и объект висит... :(


    Сталкивались уже с такой фигней при работе с WMRM SDK, там тоже с VB все чудесно работает - метод нормально вызывается, а с php ни в какую :(.

    Попробуйте поискать сначало - может есть метод в SpVoice, который позволяет корректно заменить один дочерний объект на другой.
    Или попробуйте, сначало удалить этот объект а потом добавить свой... наверное должен быть какой то джеструктор у $voice->AudioOutputStream?
    хотя конечно можете в лоб попробовать unset($voice->AudioOutputStream);
     
  7. borodulin

    borodulin Активный пользователь

    С нами с:
    20 апр 2007
    Сообщения:
    4
    Симпатии:
    0
    Подобных методов в SpVoice нет
    в лоб тоже не помогло :(
    Но все равно спасибо за помощь