2015-01-10 2 views
1

이 구조 I는 아래 C# code에 정의 http://msdn.microsoft.com/en-us/library/windows/hardware/ff541621%28v=vs.85%29.aspxC# 새 포인터 구조체를 정의하는 방법은 무엇입니까?

typedef struct _FILTER_MESSAGE_HEADER { 
    ULONG  ReplyLength; 
    ULONGLONG MessageId; 
} FILTER_MESSAGE_HEADER, *PFILTER_MESSAGE_HEADER; 

에서 정의이다 : 만 C# codeFILTER_MESSAGE_HEADER 정의

[StructLayout(LayoutKind.Sequential)] 
public struct FILTER_MESSAGE_HEADER { 
     public uint replyLength; 
     public ulong messageId; 
}; 

, PFILTER_MESSAGE_HEADER 아니다.

어떻게 정의해야합니까? PFILTER_MESSAGE_HEADER ??

P/S : 함수에서이 구조체를 사용하려면 PFILTER_MESSAGE_HEADER을 정의하고 싶습니다.

답변

2

PFILTER_MESSAGE_HEADER을 정의 할 필요는 없습니다. 적절한 경우 out 또는 ref 중 하나로 지정하십시오.

[DllImport(fltmgr, CharSet=CharSet.Unicode, ExactSpelling=true, PreserveSig=false)] 
void FilterGetMessage(
    CommunicationPortSafeHandle hPort, 
    ref FILTER_MESSAGE_HEADER lpMessageBuffer, 
    uint dwMessageBufferSize, 
    IntPtr lpOverlapped); 

나는 PreserveSig를 사용 : 당신이 FilterGetMessage에 특별히 관심이 있다면

[DllImport("foo")] 
void SomeMethod(ref FILTER_MESSAGE_HEADER lpMessageBuffer); 


, 나는 어떤이에서 내 보낸 DLL하지만, 하나 명의 가능한 서명이 다음과 같이 될 경우 모르겠어요 오류가 발생하면 HRESULT을 예외로 자동 변환하기 위해 CharSet 사양은 방어 적이므로 ExactSpelling이 필요합니다. CommunicationPortSafeHandleSafeHandleMinusOneIsInvalid을 기반으로 the documentation on FilterConnectCommunicationPort을 상속받은 클래스입니다.

과 같이이 서명을 사용

:이 FilterGetMessage (이다

FILTER_MESSAGE_HEADER header; 
FilterGetMessage(hFilter, ref header, 
    Marshal.SizeOf(typeof(FILTER_MESSAGE_HEADER)), IntPtr.Zero); 
+0

http://msdn.microsoft.com/en-us/library/windows/hardware/ff540506%28v=vs.85%29 .aspx). **'PFILTER_MESSAGE_HEADER' **는 매개 변수 유형입니다. 다음 : C#으로 변경하면 ** FILTER_MESSAGE_HEADER **를 ** 사용합니다. 맞아? – GSP

+0

기본적으로 그렇습니다. – Mitch

+0

대단히 감사합니다! – GSP

관련 문제