본문 바로가기
Education/Bit 18th

[Windows Mobile] 초보용팁- 플랫폼 호출 서비스(PInvoke) 이해 하기

by ★용호★ 2009. 12. 6.

개발환경
Visual Studio 2008
C#



Windows Mobile 프로그래밍시 C# 언어를 사용한다는 것은 쉽고 간단하고 시작하기 쉽다는 장점이 있습니다.

하지만 그 반대로 복잡하거나 어려운 동작 예를 들면 모션제어, 카메라, 미디어.. 등등 을 구현하기에는
아직까지는 부족한게 현실 입니다.
자료를 구하기도 힘들고 막상 찾는다 하더라도 구현해 보면 속도가 느려지는 경우가 많습니다.

이에 .NET 에서는 PInvoke - 플랫폼 호출 서비스 라는 기능을 제공하는데
C, C++ 로 작성된 네이티브 메소드를 호출할 수 있는 기능입니다.



이런 PInvoke 를 사용하기 위해서는 using 선언문에 다음을 추가해 주면 가능 합니다.

 System.Runtime.InteropServices;


그리고 사용할 API를 호출 합니다.

DllImport() 안에 호출할 DLL 이름과
EntryPoint 로 정의된 네이티브 메소드의 이름을 불러오거나 PInvoke에서 사용되는 별칭을 직접 정의 합니다.
SetLastError 로 메소드를 호출한 후 발생한 에러 코드의 저장 여부를 정합니다.


[DllImport("CoreDll.DLL", EntryPoint = "Play" SetLastError=
true
]
private  static extern int PlaySound(string szSound, IntPtr hMod, int flags);


extern 키워드는 해당 메소드가 외부에 있다는 것을 나타내는 키워드이므로
해당 메소드를 정의 할 필요는 없습니다.



WAV 파일을 플레이하는 예제를 한번 해보겠습니다.

텍스트 박스 1개, 버튼 3개를 아래와 같이 배치하고
openFileDialog 를 1개 배치 합니다.




PInvoke 사용과 wav파일을 불러오기 위해
using 선언문에 아래를 추가 합니다.

using System.Runtime.InteropServices;
using System.IO;


CoreDll.DLL 을 호출하고
사운드 재생과 관련한 플래그 값들을 설정 합니다.

   [DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
    private extern static int WavPlay(string szSound, IntPtr hMod, int flags);

        private enum Flags
        {
            SND_SYNC = 0x0000,
            SND_ASYNC = 0x0001,
            SND_NODEFAULT = 0x0002,
            SND_MEMORY = 0x0004,
            SND_LOOP = 0x0008,
            SND_NOSTOP = 0x0010,
            SND_NOWAIT = 0x00002000,
            SND_ALIAS = 0x00010000,
            SND_ALIAS_ID = 0x00110000,
            SND_FILENAME = 0x00020000,
            SND_RESOURCE = 0x00040004
        }



각 버튼의 클릭 이벤트를 정의 합니다.

버튼 1 클릭시 탐색기로  wav 파일을 찾을수 있으며
버튼 2는 플레이를 버튼 3은 정지를 하게 됩니다.

    private void button1_Click(object sender, EventArgs e)
        {      
            openFileDialog1.Filter = "wav파일 |*.wav";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = Path.GetFullPath(openFileDialog1.FileName);
            }
        }


        private void button2_Click(object sender, EventArgs e)
        {
            WavPlay(textBox1.Text, IntPtr.Zero, (int)(Flags.SND_ASYNC | Flags.SND_FILENAME));     
        }

        private void button3_Click(object sender, EventArgs e)
        {
            WavPlay(null, IntPtr.Zero, (int)(Flags.SND_NODEFAULT));
        }




테스트 화면 입니다.
소리는 확인 시켜드릴순 없지만 WAV 파일을 찾아서 플레이 할 수 있습니다.


 

 

댓글