2008-10-21 5 views
3

Что такое подпись interop, которую вы используете для следующего COM-метода? Меня особенно интересуют последние два параметра, и попытаться ли использовать MarshalAs с SizeParamIndex или нет..NET COM Interop Method Подпись

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

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

p-значение [выход] указатель на байт буфера, содержащего значение. Передайте NULL для извлечения длины буфера .

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

ответ

2

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

+0

У меня есть. Это хороший инструмент, но он не знает, что делать с такими вещами. Предполагается, что pValue представляет собой один байт. – 2008-10-21 15:14:45

+0

Это несчастливо. – 2008-10-21 17:22:29

1

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

Так последние параметры будет в C# подписи:

byte[] pValue, 
ref ushort pcbLength 

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

Смежные вопросы