Окно из dll
От: vvs86 Великобритания  
Дата: 11.08.05 15:24
Оценка:
Есть прога на 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++ я его не вижу. В чём дело? Спасибо
Re: Окно из dll
От: Аноним  
Дата: 12.08.05 02:49
Оценка:
Здравствуйте, 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 ?
Re[2]: Окно из dll
От: vvs86 Великобритания  
Дата: 12.08.05 14:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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()
Re: Окно из dll
От: anvaka Украина Yasiv
Дата: 12.08.05 14:59
Оценка:
Здравствуйте, vvs86.

Увы, не могу точно ответить на вопрос, но предлагаю поэксперементировать...
Все ли в порядке с родителем этого окна? Его видно?
Приходит ли сообщение WM_CREATE?
Посмотрите, когда приходят WM_DESTROY?
Может ли что-то убивать его раньше, чем Вы успеваете запустить spyxx?
Re: Окно из dll
От: MShura  
Дата: 12.08.05 15:16
Оценка:
Здравствуйте, vvs86, Вы писали:

V>Есть прога на C#, которая в определённый момент создаёт себе окно из неуправляемой dll (это окно работает с OpenGL и написано на C/C++). В длл такой код



V>Класс регистрируется, окно создаётся (GetLastError=0), но ни на эране ни в Spy++ я его не вижу. В чём дело? Спасибо


А цикл обработки сообщений в этом потоке есть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.