При вызове функции 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.
Спасибо за внимание.
Здравствуйте, 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 своего процесса.