Ошибка доступа при вызове CreateWindowEx
От: Buratinos  
Дата: 27.09.04 08:06
Оценка:
При вызове функции CreateWindowEx происходит ошибка доступа памяти, каждый раз по разным адресам.
BCB6, Delphi7, WinXP SP1.
Вот код:

//-----------Project---------------------------------------------------------
#include <windows.h>
#include "uglyuck.hpp"
#pragma hdrstop
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
          SvcEntry();
        }
        catch (...)
        {
        }
        return 0;
}
//---------------------------------------------------------------------------


unit uGlyuck;

interface
procedure SvcEntry;

implementation

uses Windows;

const WndClsName: PChar  = 'DevNotHandlerWin';

function WinProc(hWind: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): integer;
begin
  Result:= DefWindowProc(hWind, uMsg, wParam, lParam);
end;



procedure SvcEntry;
var
  Mesg: MSG;
  hWin: HWND;
  WindowClass: TWNDCLASSEX;
  ClsAtom: ATOM;

begin
  WindowClass.cbSize:= sizeof(TWNDCLASSEX);
  WindowClass.style:= CS_DBLCLKS;
  WindowClass.lpfnWndProc:= (@WinProc);
  WindowClass.cbClsExtra:= 0;
  WindowClass.cbWndExtra:= 0;
  WindowClass.hInstance:= GetModuleHandle(nil);
  WindowClass.hIcon:= 0;//LoadIcon(nil, );
  WindowClass.hCursor:= 0;//LoadCursor(0, IDC_ARROW);
  WindowClass.hbrBackground:= 0;//HBRUSH(COLOR_BTNFACE);
  WindowClass.lpszMenuName:= nil;
  WindowClass.lpszClassName:= WndClsName;
  WindowClass.hIconSm:= 0;

  ClsAtom:= $0000;
  ClsAtom:= RegisterClassEx(WindowClass);
  if ClsAtom = 0 then begin
    Exit;
  end;
  hWin:= CreateWindowEx(0,
                        WndClsName,
                        'HandlerWindow',
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        0,
                        0,
                        0,
                        nil);
  if hWin = 0 then begin
    UnregisterClass(pointer(ClsAtom), hInstance);
    Exit;
  end; //if



  while GetMessage(Mesg, 0, 0, 0) do begin
    TranslateMessage(Mesg);
    DispatchMessage(Mesg);
  end;

  UnregisterClass(pointer(ClsAtom), hInstance);
end;

end.



Спасибо за внимание.
Re: Ошибка доступа при вызове CreateWindowEx
От: Avanturist  
Дата: 27.09.04 08:18
Оценка:
Здравствуйте, Buratinos, Вы писали:

B>При вызове функции CreateWindowEx происходит ошибка доступа памяти, каждый раз по разным адресам.

B>BCB6, Delphi7, WinXP SP1.
B>Вот код:

B>
B>//-----------Project---------------------------------------------------------
B>#include <windows.h>
B>#include "uglyuck.hpp"
B>#pragma hdrstop
B>//---------------------------------------------------------------------------
B>WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
B>{
B>        try
B>        {
B>          SvcEntry();
B>        }
B>        catch (...)
B>        {
B>        }
B>        return 0;
B>}
B>//---------------------------------------------------------------------------
B>


B>
B>unit uGlyuck;

B>interface
B>procedure SvcEntry;

B>implementation

B>uses Windows;

B>const WndClsName: PChar  = 'DevNotHandlerWin';

B>function WinProc(hWind: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): integer;
B>begin
B>  Result:= DefWindowProc(hWind, uMsg, wParam, lParam);
B>end;



B>procedure SvcEntry;
B>var
B>  Mesg: MSG;
B>  hWin: HWND;
B>  WindowClass: TWNDCLASSEX;
B>  ClsAtom: ATOM;

B>begin
B>  WindowClass.cbSize:= sizeof(TWNDCLASSEX);
B>  WindowClass.style:= CS_DBLCLKS;
B>  WindowClass.lpfnWndProc:= (@WinProc);
B>  WindowClass.cbClsExtra:= 0;
B>  WindowClass.cbWndExtra:= 0;
B>  WindowClass.hInstance:= GetModuleHandle(nil);
B>  WindowClass.hIcon:= 0;//LoadIcon(nil, );
B>  WindowClass.hCursor:= 0;//LoadCursor(0, IDC_ARROW);
B>  WindowClass.hbrBackground:= 0;//HBRUSH(COLOR_BTNFACE);
B>  WindowClass.lpszMenuName:= nil;
B>  WindowClass.lpszClassName:= WndClsName;
B>  WindowClass.hIconSm:= 0;

B>  ClsAtom:= $0000;
B>  ClsAtom:= RegisterClassEx(WindowClass);
B>  if ClsAtom = 0 then begin
B>    Exit;
B>  end;
B>  hWin:= CreateWindowEx(0,
B>                        WndClsName,
B>                        'HandlerWindow',
B>                        WS_OVERLAPPEDWINDOW,
B>                        CW_USEDEFAULT,
B>                        CW_USEDEFAULT,
B>                        CW_USEDEFAULT,
B>                        CW_USEDEFAULT,
B>                        0,
B>                        0,
B>                        0,
B>                        nil);
B>  if hWin = 0 then begin
B>    UnregisterClass(pointer(ClsAtom), hInstance);
B>    Exit;
B>  end; //if



B>  while GetMessage(Mesg, 0, 0, 0) do begin
B>    TranslateMessage(Mesg);
B>    DispatchMessage(Mesg);
B>  end;

B>  UnregisterClass(pointer(ClsAtom), hInstance);
B>end;

B>end.
B>



B>Спасибо за внимание.



Ну для начала зачем тебе Ex если ты все равно не исп. расширенных стилей, а во вторых где ты в функцию передаешь hinstance своего процесса.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.