CreateWindowEx завершается ошибкой с ERROR_CANNOT_FIND_WND_CLASS - PullRequest
2 голосов
/ 07 декабря 2010

Я пытаюсь создать окно с определенным типом класса («VSDebugger CDataTipWnd»), однако, когда я запускаю CreateWindowEx, это терпит неудачу, и GetLastError сообщает мне, что класс не найден.Вот код для справки, хотя это не должно иметь значения:

const Win32WindowStyles dwStyle = Win32WindowStyles.WS_POPUP;
IntPtr wnd = NativeMethods.CreateWindowEx(0L, "VSDebugger CDataTipWnd", "MyWindow",
                                                  dwStyle, 100, 100, 100, 100, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);

Я работаю как плагин в процессе, и я знаю, что окно этого класса было создано ранее (я убедился,с использованием Winspector / Spy ++), но когда я пытаюсь создать окно такого типа самостоятельно, оно не работает, и я не могу понять, почему.

Документация говорит, что «Имя класса может быть любым именем, зарегистрированным в RegisterClass или RegisterClassEx, при условии, что модуль, который регистрирует класс, является также модулем, который создает окно. Имя класса также может быть любым из предопределенных имен системных классов.список имен системных классов, см. раздел «Замечания».Возможно ли, что RegisterClass действительно был создан в другом модуле (dll / exe)?Делает ли просто создание класса в другом модуле недоступным по имени из другого модуля?Если да, могу ли я как-то найти этот класс и создать с ним окно?

Спасибо!Виталий

Ответы [ 2 ]

2 голосов
/ 07 декабря 2010

Вы передаете IntPtr.Zero аргументу HINSTANCE.

HINSTANCE модуля (EXE или DLL), который зарегистрировал класс, должен быть предоставлен CreateWindowEx.

Если вы считаете, что основной EXE-файл зарегистрировал класс, вы можете получить HINSTANCE через GetModuleHandle (IntPtr.Zero).

Если другая DLL зарегистрировала класс, вам понадобится какой-то способ узнать, какой из них и получить его HINSTANCE / HMODULE (в наши дни они совпадают).

1 голос
/ 07 декабря 2010

Это, наверное, так.Предоставляет ли программа API для этого?Вы упоминаете, что работаете как плагин к нему - я думаю, это был бы способ сделать это.

...