Как исправить "System.MissingMethodException = {" Не удается найти PInvoke DLL 'user32.dll'.}} В Windows 6.5? - PullRequest
3 голосов
/ 08 сентября 2011

Я пытаюсь использовать pInvoke, но на эмуляторе и на устройстве вызов не выполняется.Я новичок в .NET (являюсь разработчиком на C ++) и не понимаю, как JIT / framework не может найти эту DLL / метод / и т. Д.

Есть ли что-то еще, что мне нужно сделать, чтобы получитьчтобы это работало?

При рассмотрении подобных вопросов выясняется, что мне может или не нужно добавлять DLL либо в решение, либо в CAB - но где мне взять этот файл.

Наверняка в ОС на устройстве есть user32.dll?И версия Windows 7 не может быть правильной для установки на устройство, не так ли?

РЕДАКТИРОВАТЬ

Любая из этих ошибок:

[DllImport("coredll.dll", EntryPoint = "FindWindowW", SetLastError = true)]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", SetLastError=true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);

        [DllImport("user32.dll", SetLastError = true)]
        internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        [DllImport("coredll.dll", EntryPoint = "SipShowIM")]
        public static extern bool SipShowIMP(int code);

        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();

1 Ответ

4 голосов
/ 08 сентября 2011

Наверняка в ОС на устройстве есть user32.dll?

Нет, к сожалению, это не так. Windows Mobile не включает user32.dll, а также многие другие обычные библиотеки DLL API Windows. Вместо этого вам обычно нужно вместо P / Invoke ввести coredll.dll. Информацию о подписи см. В разделе PInvoke.net (внизу слева) «Функции интеллектуального устройства».


Edit:

Некоторые подписи там явно неверны, как вы упоминаете в комментариях. Чтобы получить правильную подпись, вы можете обратиться к Windows Mobile API для функций (таких как SetWindowPos ).

Полагаю, для вас большинство должно быть в coredll.dll:

[DllImport("coredll.dll", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("coredll.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);

[DllImport("coredll.dll", SetLastError = true)]
internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

[DllImport("coredll.dll", EntryPoint = "SipShowIM")]
public static extern bool SipShowIMP(int code);

[DllImport("coredll.dll")]
public static extern IntPtr GetForegroundWindow();
...