3 Stimmen

.NET COM Interop Methode Signatur

Welche Interop-Signatur würden Sie für die folgende COM-Methode verwenden? Ich interessiere mich vor allem für die letzten beiden Parameter und die Frage, ob ich versuchen soll, die MarshalAs mit einer SizeParamIndex oder nicht.

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

In der Dokumentation heißt es:

pWert [out] Zeiger auf einen Byte-Puffer, der den Wert enthält. Übergeben Sie NULL um die Länge des Puffers abzufragen erforderlich.

pcbLength [in, out] Bei der Eingabe Zeiger auf eine Variable, die die Länge von pValue enthält. Bei der Ausgabe wird die Variable c in pValue verwendet.

2voto

Jeff Yates Punkte 59874

Sie könnten versuchen, die PInvoke-Signatur-Toolkit . Es ist ziemlich nützlich, um bei der Durchführung von Plattform-Interops das richtige Marshaling zu erreichen. Es ist gut möglich, dass es Ihr spezielles Problem nicht abdeckt, aber vielleicht finden Sie eine vergleichbare Lösung, die Ihnen die gewünschten Informationen liefert.

1voto

EFrank Punkte 1820

Ich würde den SizeParamIndex verwenden, denn Ihr Szenario ist genau das, wofür diese Funktion gedacht ist: Um die Länge eines Arrays mit variabler Größe anzugeben.

Die letzten beiden Parameter würden also in der C#-Signatur stehen:

byte[] pValue,
ref ushort pcbLength

Das Byte-Array wird ohne ref da das Array im nativen Code einem Zeiger entspricht. Wenn Sie NULL (oder null in C#) für pValue übergeben, um die Größe des benötigten Puffers abzurufen. Das bedeutet auch, dass der Aufrufer das Byte-Array allozieren muss. Der Parameter pcbLength wird übergeben von ref da er als Eingangs-/Ausgangsparameter verwendet wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X