CreateWindowEx失败,ERROR_CANNOT_FIND_WND_CLASS

问题描述:

我试图创建一个窗口与某种类型(“VSDebugger CDataTipWnd”),但是,当我运行CreateWindowEx它失败,GetLastError告诉我,该类未找到。下面是引用的代码,但它不应该的问题:CreateWindowEx失败,ERROR_CANNOT_FIND_WND_CLASS

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 ++),但是,当我尝试自己创建这种类型的窗口时,它不起作用,我无法弄清楚原因。

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

谢谢! 维塔利

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

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

如果您认为主EXE注册了类,那么您可以通过GetModuleHandle(IntPtr.Zero)获取它的HINSTANCE。

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

+0

听起来很对,谢谢!我会尝试一下。 – VitalyB 2010-12-07 08:04:18

可能是这种情况。程序是否提供了API来执行此操作?你提到你正在作为一个插件运行 - 我认为这将是实现它的方式。

+0

恐怕不是......我只是放弃这样做后才这样做。 – VitalyB 2010-12-06 22:20:44