我试图创建一个具有特定类类型(“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++ 确保了这一点),但是,当我尝试自己创建此类窗口时,它不起作用,我不明白为什么。
The 文档 http://msdn.microsoft.com/en-us/library/ms632679%28VS.85%29.aspx说“类名可以是使用 RegisterClass 或 RegisterClassEx 注册的任何名称,前提是注册该类的模块也是创建窗口的模块。类名也可以是任何预定义的系统类名。对于系统类名称列表,请参阅备注部分。” RegisterClass 是否有可能确实是在另一个模块(dll/exe)中创建的?仅在另一个模块中创建一个类是否会导致无法从另一个模块中通过名称访问该类?如果是这样,我仍然可以以某种方式找到该类并用它创建一个窗口吗?
谢谢!
维塔利
您将 IntPtr.Zero 传递给 HINSTANCE 参数。
注册该类的模块(EXE 或 DLL)的 HINSTANCE 必须提供给 CreateWindowEx。
如果您认为主 EXE 注册了该类,那么您可以通过 GetModuleHandle(IntPtr.Zero) 获取其 HINSTANCE。
如果另一个 DLL 注册了该类,那么您将需要某种方法来知道是哪个 DLL 并获取其 HINSTANCE/HMODULE(现在这两个是相同的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)