0

나는 시스템 dll에 대한 호출을 몇 시간 동안 수행하기 위해 고심하고 있습니다. 나는 마침내 그것이 작동하게하는 방법을 이해했다. 그러나 나는 이유를 모른다.VB.Net ByVal 전달 될 때 ByVal 전달 될 때 내 마샬링 된 구조가 업데이트되는 이유 ByRef

구조체를 라이브러리 함수 midiOutPrepareHeader에 전달해야하며 그 구조체에는 할당 한 버퍼에 대한 포인터와 라이브러리가 설정하는 일부 플래그가 들어 있습니다. 선언에서 나는 원래 ByReflpMidiOutHdr As IntPtr을 가졌습니다. 명백한 오류는 없었지만 다음 함수 호출은 항상 버퍼가 준비되지 않았 음을보고했습니다 (준비된 플래그가 설정되지 않았습니다). 결국 ByVallpMidiOutHdr As IntPtr으로 변경했을 때 호출 후 구조의 복사본에 플래그가 설정되고 후속 기능이 작동했습니다.

(구조를 검사하고 무슨 일이 있었는지 확인하기 위해 사용한 코드를 제거했지만 기본적으로이 코드는 검사 할 수 있도록 데이터를 "비 정렬"하기 위해 PtrToStructure을 사용했습니다).

아무도 내가 값으로 전달할 때 dll에서 데이터를 가져 오는 이유를 설명 할 수 있습니까?

감사합니다. Adrian

답변

0

midiOutPrepareHeader 메서드의 두 번째 매개 변수는 "준비 할 버퍼를 식별하는 MIDIHDR 구조의 포인터"입니다. IntPtr이 그 포인터입니다. 매개 변수 ByRef을 선언하면 포인터 자체를 전달하는 대신 포인터에 포인터를 전달하고있었습니다.