2008-10-21 6 views
3

다음 COM 메서드에 사용할 interop 서명은 무엇입니까? 특히 마지막 두 매개 변수에 대해 관심이 있으며 MarshalAsSizeParamIndex과 함께 사용할지 여부를 결정해야합니다..NET COM Interop 메서드 서명

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

문서 상태 : 값을 포함한 바이트 버퍼

유의 확률 [출력] 포인터. 버퍼 길이를 검색하려면 을 전달하십시오. 이 필요합니다.

pcbLength [in, out] 입력시, 길이의 pValue를 포함하는 변수를 가리키는 포인터. 출력시 변수에는 사용 된 pValue의 바이트 수 이 포함됩니다.

답변

2

시도해 볼 수 있습니다. PInvoke Signature Toolkit. 플랫폼 상호 운용성을 수행 할 때 마샬링을 올바르게 수행하는 데 유용합니다. 그것은 당신의 특별한 문제를 다루지는 않을 지 모르지만, 당신이 찾는 정보를 제공하는 비슷한 것을 찾을 수 있습니다.

+0

나는 있습니다. 좋은 도구이지만, 이런 일을 어떻게 해야할지 모르겠습니다. pValue는 단일 바이트라고 가정합니다. –

+0

그건 불행한 일입니다. –

+0

다른 데이터가 없기 때문에 byte *로 간주됩니다. SAL 주석을 추가하여 적절한 호출을 생성 할 수있는 충분한 컨텍스트를 제공 할 수 있습니다. – JaredPar

1

시나리오가이 기능과 정확히 일치하기 때문에 SizeParamIndex를 사용합니다. 가변 크기 배열의 길이를 지정하려면. 매개 변수에 따라서 마지막

C#을 서명에있을 것입니다 : 배열 네이티브 코드에 대한 포인터에 해당하기 때문에

byte[] pValue, 
ref ushort pcbLength 

바이트 배열, 심판없이 전달됩니다. 필요한 버퍼의 크기를 검색하기 위해 pValue에 NULL (또는 C#에서는 null)을 전달하는 경우. 즉, 호출자는 바이트 배열을 할당해야합니다. 매개 변수 pcbLength가 참조으로 전달되었으므로 입력/출력 매개 변수로 사용됩니다.

+0

pValue에 대한 참조가 잘못되었습니다. 네이티브 서명을 보면 단 하나의 간접 레벨 (한 포인터) 만 있습니다. 배열 + ref = 2 간접 참조 레벨을 가짐. – JaredPar

+0

당신 말이 맞습니다, JaredPar. 감사! 내 원래 답변을 편집하여 귀하의 의견을 통합, – EFrank