Преобразование: #define xxxxxx ((LPCSTR) 4) - PullRequest
0 голосов
/ 13 января 2010

В WinCrypt.h я вижу:

#define CERT_CHAIN_POLICY_SSL   ((LPCSTR) 4)

WINCRYPT32API BOOL WINAPI CertVerifyCertificateChainPolicy(
    IN LPCSTR pszPolicyOID,
    IN PCCERT_CHAIN_CONTEXT pChainContext,
    IN PCERT_CHAIN_POLICY_PARA pPolicyPara,
    IN OUT PCERT_CHAIN_POLICY_STATUS pPolicyStatus
    );

Первый аргумент принимает CERT_CHAIN_POLICY_SSL. Похоже, что это указатель на строку C, но это целое число!?

Указатель, очевидно, является 32-битным целым числом, но на что он указывает? Если число <255, оно займет один байт, так является ли строка C фактически однобайтовой «строкой» (т. Е. Байтом)? </p>

При преобразовании в другой язык, который поддерживает переменные BYTE, я могу просто создать bVar (переменную BYTE) и назначить его 4. Затем я могу передать указатель на эту переменную BYTE?

Ответы [ 4 ]

1 голос
/ 13 января 2010

Иногда API принимает параметр, который может быть «cookie» или идентификатором для известного объекта или указателем на имя (например), что, как представляется, имеет место в данном случае. 4 - это cookie / handle / ID для хорошо известной политики CERT_CHAIN_POLICY_SSL. Некоторые пользователи API могут указывать политику, которая не известна библиотеке заранее, но определяется именем, которое она может где-то искать (например, реестр, файл конфигурации или что-то в этом роде).

В некотором роде GetProcAddress() может взять указатель на имя функции, для которой вы хотите адрес (который используется в 99% случаев сегодня), или указатель Параметр -to-a-string может быть числом, указывающим порядковый номер функции.

Перегрузка параметров указателя, подобных этому, - неудачный метод, который иногда используется для повышения гибкости API. К счастью, это не особенно распространено.

В любом случае, если вы хотите вызвать этот API из другого языка и указать политику CERT_CHAIN_POLICY_SSL, вам нужно передать 4 для значения указателя (не указатель, указывающий на значение 4).

1 голос
/ 13 января 2010

Вы должны понимать, что некоторые API спроектированы так, чтобы быть как можно более короткими и компактными, даже если это может привести к путанице среди пользователей. Например, функция CreateDialog позволяет вам указать идентификатор строкового ресурса. Но вы также можете указать целочисленные идентификаторы. Поэтому Microsoft решила, что вы можете передать целочисленный идентификатор в том же аргументе (указатель!). Здесь может быть то же самое - эта функция может позволять вам указывать строковый идентификатор политики или целочисленный. Для компактности обе формы передаются в одном аргументе.

1 голос
/ 13 января 2010

Указатель не указывает ни на что. В 32-разрядной системе это будет (почти наверняка, недействительный) указатель со значением 0x00000004.

Что касается других языков, то, например, в C # он может быть представлен как System.IntPtr.

Вы могли бы думать об этом отвратительном кастинге как о ленивом способе выполнения

union StringOrInteger
{
  const char* str;
  int n;
};
0 голосов
/ 13 января 2010

Нет, вы не можете передать указатель на БАЙТ, содержащий значение. Это привело бы к тому, что API C «увидел» значение указателя, которое является истинным адресом (адресом этого BYTE), а не маленькое целое число, переданное как указатель, которого он ожидает.

Строки нет, просто используется значение указателя. То, что он объявлен как указатель на строку, не имеет значения, это может быть также указатель на число с плавающей точкой или (лучше) void*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...