none
C# mobile 呼叫 win32 API RRS feed

  • 問題

  •  我最近想要開發mobile 5.0我使用的工具是visual studio 2005, 以c#作為語言, 參考了別人的範例, 但是在呼叫win32的API時, runtime會一值出現問題說找不到User32.dll或是kernel32.dll, 不知道這是哪裡出了問題, 希望有人能為我解答, 謝謝, 以下是我寫的一段程式碼, 在紅色的地方會產生exception.

    [DllImport("User32.dll")]
            static extern Boolean MessageBeep(UInt32 beepType);
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                IntPtr handle = IntPtr.Zero;
                try
                {

                    MessageBeep(0);

                } catch
                {
                    throw;
                }
                finally
                {
                    // Release handle of the snapshot
                    CloseHandle(handle);
                    handle = IntPtr.Zero;
                }

    2006年8月11日 上午 02:24

所有回覆

  • 在 PC 上跑的 Windows 和在 Mobile Device 上跑的 Windows 還是不一樣滴 ...
    MessageBeep() 應該是在 "MsgBeep.dll" 中,你可以把 User32.dll 改成 MsgBeep.dll 試看看 .
    2006年8月11日 上午 03:10
  • 它真的找不到User32.dll...
    2006年8月11日 上午 05:19
  • 後來我找到答案了,改成這樣後就可行了

    [DllImport("coredll")]
            static extern Boolean MessageBeep(UInt32 beepType);

    現在我遇到了另一個問題,我想要抓出目前在系統上的process,下面這段code是可以compile過,但是在執行的時候, 會抓不到我目前的process, info.szExeFile會是空的,不知道有沒有人發生過這問題,我是用在windows mobile 5.0上執行的

    [StructLayout(LayoutKind.Sequential)]
            private struct PROCESSENTRY32
            {
                public uint dwSize;
                public uint cntUsage;
                public uint th32ProcessID;
                public IntPtr th32DefaultHeapID;
                public uint th32ModuleID;
                public uint cntThreads;
                public uint th32ParentProcessID;
                public int pcPriClassBase;
                public uint dwFlags;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
                public string szExeFile;
            }

            private const uint TH32CS_SNAPNOHEAPS = 0x40000000;
            private const uint TH32CS_SNAPPROCESS = 0x00000002;

     [DllImport("toolhelp")]
            private static extern int Process32First(IntPtr hSnapshot,
                                             ref PROCESSENTRY32 lppe);

            [DllImport("toolhelp")]
            private static extern int Process32Next(IntPtr hSnapshot,
                                            ref PROCESSENTRY32 lppe);

            [DllImport("toolhelp", SetLastError = true)]
            private static extern IntPtr CreateToolhelp32Snapshot(uint dwFlags,
                                                           uint th32ProcessID);

            [DllImport("toolhelp", SetLastError = true)]
            private static extern bool CloseHandle(IntPtr hSnapshot);

            private void button1_Click(object sender, EventArgs e)
            {
                IntPtr handle = IntPtr.Zero;
                try
                {

                    handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS, 0);

                    PROCESSENTRY32 info = new PROCESSENTRY32();

                    info.dwSize = (uint)System.Runtime.InteropServices.
                                  Marshal.SizeOf(typeof(PROCESSENTRY32));

                    // Get the first process
                    int first = Process32First(handle, ref info);

                    do
                    {
                        comBprocess.Items.Add(info.szExeFile);
                    }
                    while (Process32Next(handle, ref info) != 0);
                }

    2006年8月11日 上午 05:31
  • 順便提一下,您最早的問題是因為你呼叫的是Windows的Win32 API,

    在行動裝置上(Windows Mobile/Windows CE)都必須要呼叫WinCE API,

    函式的簽名(signature)在PC或PDA上大致都一樣,只是飲用的DLL名稱不同

    WinCE大部分的API都在coredll.dll,不像PC會分User, Kernel32等...

    實際API位在那個DLL,要查MSDN文件才知道

    2006年8月11日 上午 09:13