от
Мой вопрос касается привязок Win32-Ada, предоставляемых пакетами:
Win32.Mgmtapi
Win32.Snmp
Я хотел бы использовать следующую функцию, определенную в пакете
Win32.Mgmtapi
:
function SnmpMgrOidToStr
  (oid    : access Win32.Snmp.AsnObjectIdentifier;
   string : access Win32.LPSTR)
  return Win32.BOOL;
У меня есть доступ к переменной
Variable_Binding
типа
Win32.Snmp.a_RFC1157VarBind_t
. Следующие четыре типа определены в пакете
Win32.Snmp
:
type AsnObjectIdentifier is record
   idLength : Win32.UINT;
   ids      : Win32.PUINT;
end record;

subtype AsnObjectName is AsnObjectIdentifier;

type RFC1157VarBind is record
   name  : AsnObjectName;
   value : AsnObjectSyntax;
end record;

type a_RFC1157VarBind_t is access all RFC1157VarBind;
Сокращенный пример кода:
with Win32;
with Win32.Mgmtapi;
with Win32.Snmp;

procedure Test is
begin
   

Мои три вопроса:


Функция SnmpMgrOidToStr
требует тип доступа для параметра
name
. Компонент
name
, определенный в типе
RFC1157VarBind
, не совместим с этим типом доступа. Какие есть варианты преобразования компонента
name
переменной
Variable_Binding
в тип доступа? Я предполагаю, что функция
SnmpMgrOidToStr
выделяет необходимую память для переменной
OID_String
типа
Win32.LPSTR
. Как я могу преобразовать тип
Win32.LPSTR
в строку Ada (
String
/
Unbounded_String
)? Как я могу освободить выделенную память после разговора со строкой Ады? Обновить: Я добавил полный пример SNMP. Для этого требуется включенная и настроенная служба Windows SNMP. Выходные данные программы должны быть:
Opened session.
Converted string to object identifier.
Copied object identifier.
Sent request.
Type is: 4
WORKSTATION
system.sysName.0
Closed session.
В документации по функции
SnmpMgrRequest
говорится:   Примечание. Массив SnmpVarBind, на который указывает структура SnmpVarBindList, должен быть размещен с использованием функции SnmpUtilMemAlloc. А согласно документации функции
SnmpUtilMemAlloc
для освобождения выделенной памяти должна использоваться функция
SnmpUtilMemFree
. Я думаю, что я правильно распределяю память, используя этот вызов процедуры:


Новые вопросы:


Является ли этот вызов процедуры правильным?
Как я могу использовать функцию SnmpUtilMemFree
, чтобы освободить выделенную память? На данный момент память не освобождается должным образом в соответствии с инструментом Dr. Memory (версия 2.2.0-1):
Error #1: LEAK 1536 direct bytes 0x0418b850

Полный исходный код:

with Ada.Text_IO;
with Ada.Unchecked_Conversion;
with Interfaces.C.Strings;
with System;

with Win32;
with Win32.Mgmtapi;
with Win32.Snmp;

procedure SNMP_Example
is
   
    

        

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

1 Ответ

0 голосов
от
К сожалению, я не могу создать минимальный рабочий пример для тестирования кода, поэтому я не могу гарантировать, что приведенный ниже код действительно будет работать: test.adb
with Ada.Text_IO;
with Ada.Unchecked_Conversion;
with Interfaces.C.Strings;

with Win32;
with Win32.Mgmtapi;
with Win32.Snmp;

procedure Test is

   pragma Linker_Options ("

Рекомендации:


Документы MS: SnmpMgrOidToStr [1]
MS Docs: SnmpUtilMemFree [2]
Документы MS: LPSTR [3]

    
...