CreateWindowEx因ERROR_CANNOT_FIND_WND_CLASS而失败

时间:2010-12-06 22:13:18

标签: windows winapi createwindow

我正在尝试创建一个具有某种类类型的窗口(“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);

我在这个过程中作为一个插件运行,我知道之前创建了这个类的Window(我使用Winspector / Spy ++确保了这个),但是,当我尝试创建这种类型的窗口时我自己,它不起作用,我无法弄清楚原因。

documentation表示“类名可以是RegisterClass或RegisterClassEx注册的任何名称,前提是注册该类的模块也是创建窗口的模块。类名也可以是任何名称预定义的系统类名称。有关系统类名称的列表,请参阅“备注”部分。“ RegisterClass是否可能确实是在另一个模块(dll / exe)中创建的?仅仅在另一个模块中创建一个类使它从另一个模块的名称无法访问?如果是这样,我还能以某种方式找到该类并用它创建一个窗口吗?

谢谢! 维塔利彼得

2 个答案:

答案 0 :(得分:2)

您正在将IntPtr.Zero传递给HINSTANCE参数。

注册课程的模块(EXE或DLL)的HINSTANCE必须提供给CreateWindowEx。

如果您认为主EXE注册了该课程,那么您可以通过GetModuleHandle(IntPtr.Zero)获得其HINSTANCE。

如果另一个DLL注册了该类,那么你需要一些方法来知道哪一个并获得它的HINSTANCE / HMODULE(这两天这两个是相同的。)

答案 1 :(得分:1)

可能就是这种情况。该程序是否提供了API来执行此操作?你提到你作为一个插件运行 - 我认为这样做是可行的。