Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2022, 02:52   #1
GrimHex
Пользователь
 
Аватар для GrimHex
 
Регистрация: 14.08.2019
Сообщений: 65
По умолчанию Как происходит проверка параметров [IN], [OUT], [IN/OUT] ?

Не обязательно объяснять то, что именно настраивают параметры [IN], [OUT], [IN/OUT] - цель темы не в этом. В примере с IDL, откомпилированный код будет вызывать динамическую библиотеку и передавать в ее функцию параметры: в такую функцию как GetSeqAndTxViaExport (); . Эти параметры настраивают поведение данной функции. Так вот, нужно разобраться, библиотечная функция "GetSeqAndTxViaExport ();":

1. В собственной ли области исполнения она проверяет наличие этих параметров?
2. Проходит ли эта проверка на этапе исполнения (неужели на этапе компиляции...)?

Привожу код просто чтобы был виден синтаксис.

Код:
import "ms-dcom.idl";
// Disable new Vista MIDL attribute if using an older MIDL compiler
#if __midl < 700
#define disable_consistency_check
#endif
[
object,
uuid(97199110-DB2E-11d1-A251-0000F805CA53),
pointer_default(unique)
]
interface ITransactionStream : IUnknown
{
HRESULT GetSeqAndTxViaExport (
[in] unsigned long ulKnownSeq,
[in] unsigned long ulcbWhereabouts,
[in, size_is(ulcbWhereabouts)] BYTE* rgbWhereabouts,
[out] unsigned long* pulCurrentSeq,
[out] unsigned long* pulcbExportCookie,
[out, size_is(,*pulcbExportCookie)]
BYTE ** prgbExportCookie);
HRESULT GetSeqAndTxViaTransmitter (
[in] unsigned long ulKnownSeq,
[out] unsigned long* pulCurrentSeq,
[out] unsigned long* pulcbTransmitterBuffer,
[out, size_is(,*pulcbTransmitterBuffer)]
BYTE** prgbTransmitterBuffer);
HRESULT GetTxViaExport (
[in] unsigned long ulRequestSeq,
[in] unsigned long ulcbWhereabouts,
[in, size_is(ulcbWhereabouts)] BYTE* rgbWhereabouts,
[out] unsigned long* pulcbExportCookie,
[out, size_is(,*pulcbExportCookie)]
BYTE** prgbExportCookie);
HRESULT GetTxViaTransmitter (
[in] unsigned long ulRequestSeq,
[out] unsigned long* pulcbTransmitterBuffer,
[out, size_is(,*pulcbTransmitterBuffer)]
BYTE** prgbTransmitterBuffer);
};
Дискриминация человека на основе его слабостей недостаточна — нужно невменяемо повторять это, получая каждый раз один и тот же результат.
GrimHex вне форума Ответить с цитированием
Старый 06.06.2022, 08:45   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

GrimHex, какой язык ?

если речь про C/C++, то в их стандартах нет таких атрибутов, это, видимо, нестандартное расширение компилятора - просто подсказка для юзера, что вот тут входной, тут выходной, а тут в обе стороны. Также подсказка по размеру, смотрю, есть (на этапе компиляции может выскочить).
В коде эта вся обвеска не участвует
Алексей1153 вне форума Ответить с цитированием
Старый 06.06.2022, 15:56   #3
GrimHex
Пользователь
 
Аватар для GrimHex
 
Регистрация: 14.08.2019
Сообщений: 65
По умолчанию

GrimHex,
Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
GrimHex, какой язык ?
C++ - не встречал раньше таких параметров. Привык к тому что Майкрософт издает документацию c кодом на C++, взял его отсюда [MS-COM]:
Component Object Model Plus (COM+) Protocol


Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
если речь про C/C++, то в их стандартах нет таких атрибутов, это, видимо, нестандартное расширение компилятора - просто подсказка для юзера, что вот тут входной, тут выходной, а тут в обе стороны. Также подсказка по размеру, смотрю, есть (на этапе компиляции может выскочить).
В коде эта вся обвеска не участвует
Мне кажется, только комментарии не участвуют в коде.

Есть тема https://stackoverflow.com/questions/...with-them-in-c

"IN/OUT Parameters and how to work with them in C++"

"Эта часть применима ко всем типам параметров — большинство интерфейсов библиотек стараются быть совместимыми с C, поэтому чаще всего параметры передаются по указателю, а не по ссылке.

IN: Когда параметр указан как IN, интерфейс предлагает гарантию, что он не изменит этот параметр. На мой взгляд, это лучше передать, пометив параметр как const, тогда сам язык предотвратит модификации значения. Если этот параметр передается по значению, не имеет значения, помечен ли он IN в документации (или const в прототипе), поскольку параметр в любом случае является локальным для функции. Но чтобы избежать копирования, его можно передать по ссылке или указателю, и в этом случае constключевое слово становится очень важным.

OUT: Параметр, помеченный как OUT, обычно означает, что значение параметра при его передаче в функцию не имеет никакого значения. На самом деле, если он передается по указателю, может даже потребоваться, чтобы он был NULL, и функция выделит память и вернет вам значение.

IN/OUT: Параметр IN/OUT обычно указывает на что-то, где и входные, и выходные значения имеют значение. Например, если у вас есть библиотечная функция, которая заполняет буфер, вам может потребоваться передать указатель на буфер вместе с другим указателем, указывающим длину буфера. Когда функция возвращается, второй указатель может содержать фактическое количество байтов, которые были записаны в буфер."

Почему тогда пишут что это C++, если Вы говорите что нет таких атрибутов?
Дискриминация человека на основе его слабостей недостаточна — нужно невменяемо повторять это, получая каждый раз один и тот же результат.
GrimHex вне форума Ответить с цитированием
Старый 06.06.2022, 16:36   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1. Это MIDL. Вам об этом говорит расширение, комменты и код:
Код:
// Disable new Vista MIDL attribute if using an older MIDL compiler
#if __midl < 700
но вы упорно игнорируете.

2.
Цитата:
Сообщение от GrimHex Посмотреть сообщение
И там говорится совсем о другом.
p51x на форуме Ответить с цитированием
Старый 06.06.2022, 19:24   #5
GrimHex
Пользователь
 
Аватар для GrimHex
 
Регистрация: 14.08.2019
Сообщений: 65
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1. Это MIDL. Вам об этом говорит расширение, комменты и код:
Код:
// Disable new Vista MIDL attribute if using an older MIDL compiler
#if __midl < 700
но вы упорно игнорируете.
Допустим, я делаю вывод, что параметры [IN], [OUT], [IN/OUT] - это специфика MIDL.

Дальше смотрю описание функции из COM: CoGetInterceptor function (callobj.h) " https://docs.microsoft.com/ru-ru/win...getinterceptor "

Код:
HRESULT CoGetInterceptor(
  [in]  REFIID   iidIntercepted,
  [in]  IUnknown *punkOuter,
  [in]  REFIID   iid,
  [out] void     **ppv
);
1. Этот пример разве привязан к MIDL компиляции?
2. Для COM/DCOM ведь можно писать на C++ и без библиотечных определений?
Дискриминация человека на основе его слабостей недостаточна — нужно невменяемо повторять это, получая каждый раз один и тот же результат.
GrimHex вне форума Ответить с цитированием
Старый 06.06.2022, 21:16   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Может это объяснит суть дела с этими модификаторами параметров.
macomics вне форума Ответить с цитированием
Старый 06.06.2022, 21:21   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от GrimHex Посмотреть сообщение
1. Этот пример разве привязан к MIDL компиляции?
Конечно. MIDL делался для описания интерфейсов и это один из них. Тем более в доке полезно иметь описание "направлений" параметров.

Цитата:
Сообщение от GrimHex Посмотреть сообщение
2. Для COM/DCOM ведь можно писать на C++ и без библиотечных определений?
Конечно. Но вот это из callobj.h надо будет определить:
Код:
HRESULT __stdcall CoGetInterceptor( 
    /* [in] */ REFIID iidIntercepted,
    /* [in] */ IUnknown *punkOuter,
    /* [in] */ REFIID iid,
    /* [out] */ void **ppv);
Цитата:
Сообщение от macomics Посмотреть сообщение
Может это объяснит суть дела с этими модификаторами параметров.
Нет. Это другой язык и другие ключевые слова.
p51x на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в ввыводе же строки с 7 по 11 происходит проверка аналогичная предидущей но не одна из ch или bln2 не стоит Ghelovek Python 6 21.08.2019 09:57
Подпрограммы (free Pascal): объяснить механизм передачи параметров и назвать правило соответствия формальных и фактических параметров Jon_Morgan Помощь студентам 1 28.12.2016 08:38
Проверка параметров печати в FastReport Wicort Компоненты Delphi 2 15.05.2015 13:32
Проверка объявления функции без параметров на С++ или С Денис6954 Фриланс 1 28.09.2014 12:28
Организация программ с использованием процедур .использованием параметров-значений и параметров переменных Фрейтор 40-500 Помощь студентам 6 02.11.2012 21:46