Подпись метода взаимодействия .NET COM - PullRequest
3 голосов
/ 21 октября 2008

Какую сигнатуру взаимодействия вы бы использовали для следующего метода COM? Меня особенно интересуют последние два параметра и то, стоит ли пытаться использовать MarshalAs с SizeParamIndex или нет.

HRESULT GetOutputSetting(
  DWORD    dwOutputNum,
  LPCWSTR  pszName,
  WMT_ATTR_DATATYPE*  pType,
  BYTE*    pValue,
  WORD*    pcbLength
);

Документация гласит:

pValue [out] Указатель на байтовый буфер, содержащий значение. Pass NULL получить длину буфера требуется.

pcbLength [in, out] При вводе указатель на переменную, содержащую длина pValue. На выходе переменная содержит количество байтов в pValue используется.

Ответы [ 2 ]

2 голосов
/ 21 октября 2008

Вы можете попробовать PInvoke Signature Toolkit . Это довольно полезно для правильного маршалинга при выполнении операций на платформе. Вполне возможно, что она не охватит вашу конкретную проблему, но вы можете найти сопоставимую, которая дает вам информацию, которую вы ищете.

1 голос
/ 21 октября 2008

Я бы использовал SizeParamIndex, потому что ваш сценарий именно для этого:

Итак, последним параметром будет сигнатура C #:

byte[] pValue,
ref ushort pcbLength

Массив byte передается без ref , поскольку массив соответствует указателю в собственном коде. Если вы передаете NULL (или NULL в C #) для pValue, чтобы получить размер необходимого буфера. Это также означает, что вызывающая сторона должна выделить байтовый массив. Параметру pcbLength передается ref , потому что он используется как параметр входа / выхода.

...