Есть прога на C#, которая в определённый момент создаёт себе окно из неуправляемой dll (это окно работает с OpenGL и написано на C/C++). В длл такой код
#include "defs.h"
HWND hWnd;
HINSTANCE hInst;
char className[]="OpenGLWindow";
int width, height;
LRESULT CALLBACK OpenGLWindowProc(HWND, UINT, WPARAM, LPARAM);
//eksportiruetsja pri pomoshhi derektiv komponovshhika
HWND __stdcall CreateOpenGLWindow(HWND parent, int x, int y, int w, int h)
{
WNDCLASS wc;
DWORD err;
width=w;
height=h;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.lpszMenuName=0;
wc.lpszClassName=className;
wc.lpfnWndProc=OpenGLWindowProc;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hIcon=0;
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hInstance=hInst;
if(!RegisterClass(&wc))
{
err=GetLastError();
}
hWnd=CreateWindow(className, className, WS_CHILD, x, y, w, h,
parent, NULL, hInst, NULL);
err=GetLastError();
ShowWindow(hWnd, SW_NORMAL);
UpdateWindow(hWnd);
return hWnd;
}
LRESULT CALLBACK OpenGLWindowProc(HWND, UINT msg, WPARAM w, LPARAM l)
{
return DefWindowProc(hWnd, msg, w, l);
}
BOOL WINAPI DllMain(HANDLE handle, DWORD reason, void*)
{
hInst=(HINSTANCE)handle;
return TRUE;
}
Класс регистрируется, окно создаётся (GetLastError=0), но ни на эране ни в Spy++ я его не вижу. В чём дело? Спасибо
Здравствуйте, vvs86, Вы писали:
V>Есть прога на C#, которая в определённый момент создаёт себе окно из неуправляемой dll (это окно работает с OpenGL и написано на C/C++). В длл такой код
V>V>#include "defs.h"
V>HWND hWnd;
V>HINSTANCE hInst;
V>char className[]="OpenGLWindow";
V>int width, height;
V>LRESULT CALLBACK OpenGLWindowProc(HWND, UINT, WPARAM, LPARAM);
V>//eksportiruetsja pri pomoshhi derektiv komponovshhika
V>HWND __stdcall CreateOpenGLWindow(HWND parent, int x, int y, int w, int h)
V>{
V>WNDCLASS wc;
V>DWORD err;
V> width=w;
V> height=h;
V> wc.cbClsExtra=0;
V> wc.cbWndExtra=0;
V> wc.lpszMenuName=0;
V> wc.lpszClassName=className;
V> wc.lpfnWndProc=OpenGLWindowProc;
V> wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
V> wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
V> wc.hIcon=0;
V> wc.hCursor=LoadCursor(NULL, IDC_ARROW);
V> wc.hInstance=hInst;
V> if(!RegisterClass(&wc))
V> {
V> err=GetLastError();
V> }
V> hWnd=CreateWindow(className, className, WS_CHILD, x, y, w, h,
V> parent, NULL, hInst, NULL);
V> err=GetLastError();
V> ShowWindow(hWnd, SW_NORMAL);
V> UpdateWindow(hWnd);
V> return hWnd;
V>}
V>LRESULT CALLBACK OpenGLWindowProc(HWND, UINT msg, WPARAM w, LPARAM l)
V>{
V> return DefWindowProc(hWnd, msg, w, l);
V>}
V>BOOL WINAPI DllMain(HANDLE handle, DWORD reason, void*)
V>{
V> hInst=(HINSTANCE)handle;
V> return TRUE;
V>}
V>
V>Класс регистрируется, окно создаётся (GetLastError=0), но ни на эране ни в Spy++ я его не вижу. В чём дело? Спасибо
What about style of window, only WS_CHILD, where is WS_VISIBLE ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, vvs86, Вы писали:
V>>Есть прога на C#, которая в определённый момент создаёт себе окно из неуправляемой dll (это окно работает с OpenGL и написано на C/C++). В длл такой код
V>>V>>#include "defs.h"
V>>HWND hWnd;
V>>HINSTANCE hInst;
V>>char className[]="OpenGLWindow";
V>>int width, height;
V>>LRESULT CALLBACK OpenGLWindowProc(HWND, UINT, WPARAM, LPARAM);
V>>//eksportiruetsja pri pomoshhi derektiv komponovshhika
V>>HWND __stdcall CreateOpenGLWindow(HWND parent, int x, int y, int w, int h)
V>>{
V>>WNDCLASS wc;
V>>DWORD err;
V>> width=w;
V>> height=h;
V>> wc.cbClsExtra=0;
V>> wc.cbWndExtra=0;
V>> wc.lpszMenuName=0;
V>> wc.lpszClassName=className;
V>> wc.lpfnWndProc=OpenGLWindowProc;
V>> wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
V>> wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
V>> wc.hIcon=0;
V>> wc.hCursor=LoadCursor(NULL, IDC_ARROW);
V>> wc.hInstance=hInst;
V>> if(!RegisterClass(&wc))
V>> {
V>> err=GetLastError();
V>> }
V>> hWnd=CreateWindow(className, className, WS_CHILD, x, y, w, h,
V>> parent, NULL, hInst, NULL);
V>> err=GetLastError();
V>> ShowWindow(hWnd, SW_NORMAL);
V>> UpdateWindow(hWnd);
V>> return hWnd;
V>>}
V>>LRESULT CALLBACK OpenGLWindowProc(HWND, UINT msg, WPARAM w, LPARAM l)
V>>{
V>> return DefWindowProc(hWnd, msg, w, l);
V>>}
V>>BOOL WINAPI DllMain(HANDLE handle, DWORD reason, void*)
V>>{
V>> hInst=(HINSTANCE)handle;
V>> return TRUE;
V>>}
V>>
V>>Класс регистрируется, окно создаётся (GetLastError=0), но ни на эране ни в Spy++ я его не вижу. В чём дело? Спасибо
А>What about style of window, only WS_CHILD, where is WS_VISIBLE ?
ShowWindow()
Здравствуйте, vvs86.
Увы, не могу точно ответить на вопрос, но предлагаю поэксперементировать...
Все ли в порядке с родителем этого окна? Его видно?
Приходит ли сообщение WM_CREATE?
Посмотрите, когда приходят WM_DESTROY?
Может ли что-то убивать его раньше, чем Вы успеваете запустить spyxx?