2014-06-17 4 views
-4

나는 pInvokes의 팬이 아니지만 나는 이것에 대해 다른 선택의 여지가 없다고 생각한다. vb.net에서 메모리 매핑 된 파일의 크기를 조정해야한다. 어쨌든, 나는이의 PInvoke pinvoke.net에서 서명을 가지고 :CreateFileMapping을 pInvoke하려면 무엇이 필요합니까?

<DllImport("kernel32.dll", SetLastError:= true, CharSet:= CharSet.Auto)> _ 
public Function CreateFileMapping(_ 
hFile as intptr, _ 
lpFileMappingAttributes As IntPtr , _ 
flProtect As FileMapProtection, _ 
dwMaximumSizeHigh As UInteger, _ 
dwMaximumSizeLow As UInteger, _ 
lpName As <MarshalAs(UnmanagedType.LPTStr)> string) as IntPtr 
End Function 

Public Enum FileMapProtection As UInteger 
    PageReadonly = &H2 
    PageReadWrite = &H4 
    PageWriteCopy = &H8 
    PageExecuteRead = &H20 
    PageExecuteReadWrite = &H40 
    SectionCommit = &H8000000 
    SectionImage = &H1000000 
    SectionNoCache = &H10000000 
    SectionReserve = &H4000000 
End Enum 

내가 가져온 System.Runtime.InteropServices을하지만 난 말았 < MarshalAs에서 오류가 발생합니다. 내가 무엇을 놓치고 있는지 또는 어디에서 왔는지 전혀 모른다. 이 참조가 어느 곳에도 의존성을 언급하지 않은 방법을 당신이 싫어하지 않습니까? 마찬가지로 내가 자발적으로 어떤 라이브러리 또는 프레임 워크 분기에서 왔는지 알고 있어야합니다. 대개 MSDN의 왼쪽 트리를 보면 알 수 있지만 이번에는 그 명령에 대한 직접적인 참조를 찾을 수 없습니다.

+1

"오류가 발생했습니다."== 도움이되지 않습니다. – ken2k

+3

사람들이 "나는 오류가있다"고 말하면서 그들이 겪을 수있는 정확한 오류를 제공하기를 거절하고, 그들이 볼 수는 있지만, 다른 누구도 볼 수는 없다는 것을 당신이 싫어할 필요는 없습니다. 사람들이 당신이 그들의 마음을 읽을 것을 기대할 때 당신은 그것을 싫어하지 마십시오. 그냥 선생님. –

+0

오류는 구문 오류를 나타내는 "유형 예상"입니다. 그러나 이전 경험에서와 같은 비교적 복잡한 선언의 구문 오류는 아무 의미가있을 수 있으며 일반적으로 기본 원인과 관련이 없으므로 유용하지 않습니다. –

답변

1

MarshalAs 속성은 매개 변수 앞에 오지 말고 매개 변수 앞에 와야합니다.

<DllImport("kernel32.dll", SetLastError:= true, CharSet:= CharSet.Auto)> _ 
public Function CreateFileMapping(_ 
    hFile as intptr, _ 
    lpFileMappingAttributes As IntPtr , _ 
    flProtect As FileMapProtection, _ 
    dwMaximumSizeHigh As UInteger, _ 
    dwMaximumSizeLow As UInteger, _ 
    <MarshalAs(UnmanagedType.LPTStr)> lpName As string) as IntPtr 
End Function 

pinvoke.net의 선언이 잘못되었습니다. 그들은 종종 그렇듯이. 가치가있는 경우 UnmanagedType.LPTStr이 기본값이므로 속성은 무의미합니다. 이 속성을 생략 할 수 있습니다.

관련 문제