CreateWindowEx失败

zhengjiankang 2010-05-23 08:22:59
rt

下面是部分代码

// 窗口类头文件
#pragma once


// CGlWnd

typedef LRESULT (CALLBACK* GLWindowProc)(HWND, UINT, WPARAM, LPARAM);

#pragma pack(push, 1)
struct sWndProc
{
BYTE op_movecx;
DWORD_PTR val_ecx;
BYTE op_call;
DWORD_PTR val_address;
};
#pragma pack(pop)


class CGlWnd
{
public:
CGlWnd();
virtual ~CGlWnd();

private:
HWND m_hWnd;
HGLRC m_hGLRC;
HDC m_hGLDC;

sWndProc m_WndProc;
public:
BOOL CreateGLWindow(LPCTSTR lpszWindowName, DWORD dwStyle, const CRect& rect, HWND hParent);
void DestoryGLWindow(GLvoid);

private:
GLvoid ResizeGLScene(GLsizei nWidth, GLsizei nHeight);
GLuint InitGL(GLvoid);
GLuint DrawGLScene(GLvoid);
GLvoid ShowGLWindow(GLuint nCmdShow);


GLWindowProc GetWndPrcEntry();
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};


// 部分实现函数
CGlWnd::CGlWnd()
: m_hWnd(NULL)
, m_hGLDC(NULL)
, m_hGLRC(NULL)
{
m_WndProc.op_movecx = 0xB9;
m_WndProc.val_ecx = (DWORD_PTR)this;
m_WndProc.op_call = 0xE9;
DWORD_PTR off = 0;
_asm
{
mov eax, CGlWnd::WndProc;
mov DWORD PTR [off], eax
}
m_WndProc.val_address =
off - ( (DWORD_PTR)(&m_WndProc.val_address) + sizeof(DWORD_PTR) );
}

GLWindowProc CGlWnd::GetWndPrcEntry()
{
return (GLWindowProc)&m_WndProc;
}

LRESULT CGlWnd::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}

BOOL CGlWnd::CreateGLWindow(LPCTSTR lpszWindowName, DWORD dwStyle, const CRect& rect, HWND hParent)
{
m_hInstance = ::GetModuleHandle(NULL);

WNDCLASS glwc;
glwc.cbClsExtra = 0;
//glwc.cbSize = sizeof(WNDCLASSEX);
glwc.cbWndExtra = 0;
glwc.hbrBackground = NULL;
glwc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
glwc.hIcon = ::LoadIcon(NULL, IDI_WINLOGO);
//glwc.hIconSm = NULL;
glwc.hInstance = ::GetModuleHandle(NULL);
glwc.lpfnWndProc = GetWndPrcEntry();
glwc.lpszClassName = _T("GLWindow");
glwc.lpszMenuName = NULL;
glwc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;

if (!::RegisterClass(&glwc))
{
TRACE("注册OpenGL窗口类失败!\n");
return FALSE;
}

m_hWnd = ::CreateWindowEx(WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, glwc.lpszClassName, lpszWindowName, WS_OVERLAPPEDWINDOW,
rect.left, rect.top, rect.Width(), rect.Height(), NULL, NULL, glwc.hInstance, NULL);
...全文
247 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengjiankang 2010-05-23
  • 打赏
  • 举报
回复
问题已解决
类的成员函数WndProc不能为__stdcall
zhengjiankang 2010-05-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 findcsdn 的回复:]
貌似 m_hInstance = ::GetModuleHandle(NULL); 这个是有问题的。

m_hInstance 一般是用Winmain传入的hInstance 值。
[/Quote]

那句话没用过~ 类里面没有m_hInstance成员
我只是在出问题的时候尝试把这个值保存起来而已 然后就删掉了~~~
我已经找到了问题是出在窗口回调函数上面~~ 只是不会解决
findcsdn 2010-05-23
  • 打赏
  • 举报
回复
另外,我也用VC写了一个纯SDK的窗口程序,扫雷游戏,你可以看看!

http://download.csdn.net/source/1396231

findcsdn 2010-05-23
  • 打赏
  • 举报
回复
貌似 m_hInstance = ::GetModuleHandle(NULL); 这个是有问题的。

m_hInstance 一般是用Winmain传入的hInstance 值。

zhengjiankang 2010-05-23
  • 打赏
  • 举报
回复
那些我都试验过了~~ GetLastError返回的信息是句柄无效~~
dinjay 2010-05-23
  • 打赏
  • 举报
回复
glwc.hInstance这个传null呢?
你可以用getlasterror函数获取一下创建窗口后的错误代码,然后msdn中都能查询errorcode的意思
zhengjiankang 2010-05-23
  • 打赏
  • 举报
回复
调用CreateGLWindow 到CreateWindow这一步返回的句柄为空
不知道是什么问题
那个用成员函数做回调函数的方法是在网上找的~
调试运行能进回调函数 但是创建窗口会失败~~ 大神们帮我分析下~
小弟在此谢谢了~

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧