Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как проверить, поддерживает ли метод интерфейса константу?  [new]
crossa
Member

Откуда:
Сообщений: 81
Использую Delphi 2009. Импортировал интерфейс:
// *********************************************************************//
// Interface: ISpVoice
// Flags:     (512) Restricted
// GUID:      {6C44DF74-72B9-4992-A1EC-EF996E0422D4}
// *********************************************************************//
type
  ISpVoice = interface(ISpEventSource)
    ['{6C44DF74-72B9-4992-A1EC-EF996E0422D4}']
    function Speak(pwcs: PWideChar; dwFlags: LongWord; out pulStreamNumber: LongWord): HResult; stdcall;
  end;

Для параметра dwFlags используются константы:
// Constants for enum SpeechVoiceSpeakFlags
type
  SpeechVoiceSpeakFlags = TOleEnum;
const
  SVSFDefault = $00000000;
  SVSFlagsAsync = $00000001;

В Windows 7 добавилась новая константа:
const
  SVSFParseSapi = $00000080;

Хорошо, при старте программы я проверяю версию операционной системы, и если это Windows 7 и выше, то использую новую константу.
var SpeechFlags: SpeechVoiceSpeakFlags;

if IsWin7
   then SpeechFlags := SVSFlagsAsync OR SVSFParseSapi
   else SpeechFlags := SVSFlagsAsync;

SpVoice.Speak(pText, SpeechFlags);

Но оказалось, что поддержка этой константы может отсутствовать в Windows 7. Об этом сообщил китайский пользователь программы: возможно, у него какая-то "левая" китайская сборка Win7 SP1, но факт остается фактом - у всех пользователей Windows 7 константа SVSFParseSapi есть в системе, а у него нет.

Отсюда вопрос: как проверить, поддерживает ли метод интерфейса конкретное значение для параметра или нет?
15 май 20, 12:01    [22133588]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить, поддерживает ли метод интерфейса константу?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50033

crossa
у всех пользователей Windows 7 константа SVSFParseSapi есть в системе, а у него нет.

"Констант" нет ни у кого. Они существую только на стадии компиляции.

crossa
Об этом сообщил китайский пользователь программы

О чём конкретно он сообщил: метод возвращает ошибку или просто значение параметра
игнорируется?

Posted via ActualForum NNTP Server 1.5

15 май 20, 12:21    [22133598]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить, поддерживает ли метод интерфейса константу?  [new]
crossa
Member

Откуда:
Сообщений: 81
Dimitry Sibiryakov

О чём конкретно он сообщил: метод возвращает ошибку или просто значение параметра игнорируется?

Метод возвращает ошибку: "The caller has specified invalid flags for this operation."
То есть, метод не поддерживает такое значение параметра.

Интерфейс хранится в системной библиотеке, так что, теоретически, можно при запуске программы находить эту библиотеку и проверять ее версию. Изначально в дистрибутиве Windows 7 присутствует нужная версия этой библиотеки, но данный пользователь, видимо, заменил ее на более старую по какой-то причине.

Не хотелось бы искать библиотеку на компьютере каждого пользователя и считывать свойства файла DLL (тем более, что файл может лежать и в папке "Windows", и в папке "Common Files", в зависимости от версии операционной системы). Неужели нет более простого способа проверить, поддерживает ли метод такое значение параметра или нет?
15 май 20, 13:12    [22133626]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить, поддерживает ли метод интерфейса константу?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50033

crossa
Метод возвращает ошибку

Вот тебе и простой способ проверить поддержку. Если, конечно, у этого класса нет метода
для выяснения поддерживаемых фич. Но это же документацию читать надо... Лень...

Posted via ActualForum NNTP Server 1.5

15 май 20, 13:17    [22133631]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить, поддерживает ли метод интерфейса константу?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11776
ISpVoice::Speak#Return Values

ValueDescription
E_INVALIDARGOne or more parameters are invalid.


Сообщение было отредактировано: 15 май 20, 13:34
15 май 20, 13:33    [22133644]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить