function QraWndProc(Wnd : HWND; msg : Cardinal; wParam, lParam : Integer) : Integer; stdcall;
var ....
rec : TQraWndRec;
begin
rec := Pointer(GetWindowLong(wnd, 0));
case msg of
....
WM_TIMER :
begin
SetWindowPos(wnd, HWND_TOPMOST, 100, 0, 100, [COLOR="Blue"]VisualizationProc(wnd, QRA_VIS_GETICONSIZE, 0, 0)[/COLOR] , 0);
end; {WM_TIMER}
....
end
end;
Вызов функции из Dll внутри класса.
Суть в том что функция (статическая линковка, stdcall вызов) нормально вызывается из оконной процедуры но когда пытаюсь вызвать ее внутри процедуры класса - вылетает "RunTime error 216".
Вот этот код работает отлично.
Код:
TQraWndRec имеет выглядит так
Код:
TQraWndRec = class
private
.....
function GetIconSize: Integer;
public
....
property IconSize : Integer read GetIconSize;
end;
.....
function TQraWndRec.GetIconSize: Integer;
begin
//result := 32;
//result := VisualizationProc(wnd, QRA_VIS_ICONSIZE, 0, 0);
end;
private
.....
function GetIconSize: Integer;
public
....
property IconSize : Integer read GetIconSize;
end;
.....
function TQraWndRec.GetIconSize: Integer;
begin
//result := 32;
//result := VisualizationProc(wnd, QRA_VIS_ICONSIZE, 0, 0);
end;
если заменить в WM_TIMER
Код:
SetWindowPos(wnd, HWND_TOPMOST, 100, 0, 100, [COLOR="Blue"]rec.IconSize[/COLOR] , 0);
то при работе вызоые IconSize если раскомментировать первую строчку, все нормально, а если второю, вылетает ошибка.
Если это имеет какое то значение, функция объявляется как
Код:
function VisualizationProc(Wnd : HWND; msg : Cardinal; wParam, lParam : Integer) : Integer; stdcall;
....
function VisualizationProc; external qravisualizationlib;
....
function VisualizationProc; external qravisualizationlib;
Цитата: 0nni
Код:
function VisualizationProc(Wnd : HWND; msg : Cardinal; wParam, lParam : Integer) : Integer; stdcall;
....
function VisualizationProc; external qravisualizationlib;
....
function VisualizationProc; external qravisualizationlib;
Хотя во всяком случае изменить можно вот так:
Код:
unit BlaBla;
interface
...
const qravisualizationlib = 'qravisualizationlib.dll';
function VisualizationProc(Wnd : HWND; msg : Cardinal; wParam, lParam : Integer) : Integer; stdcall;
external qravisualizationlib name 'VisualizationProc';
...
implementation
...
end.
interface
...
const qravisualizationlib = 'qravisualizationlib.dll';
function VisualizationProc(Wnd : HWND; msg : Cardinal; wParam, lParam : Integer) : Integer; stdcall;
external qravisualizationlib name 'VisualizationProc';
...
implementation
...
end.
Код:
interface
function VisualizationProc(Wnd : HWND; msg : Cardinal; wParam, lParam : Integer) : Integer; stdcall;
implementation
function VisualizationProc; external qravisualizationlib;
function VisualizationProc(Wnd : HWND; msg : Cardinal; wParam, lParam : Integer) : Integer; stdcall;
implementation
function VisualizationProc; external qravisualizationlib;
Объявления идут в отбельном ютине, поэтому в интерфейсной части объявляю...
И еще возможно зацепка...
Основная программа регистрирует класс из dll
Код:
RegisterQraWndClass(HInstance);//регистрация QraWndClass из qrawc.dll из основной программы
После чего происходит создание окна "QraWndClass". при создании окна (WM_CREATE, конечно), внутри qrawc.dll создается класс TQraWndRec
Код:
rec := TQraWndRec.Create(wnd, QraCreateS.pCallBack);
SetWindowLong(wnd, 0, Integer(rec));
SetWindowLong(wnd, 0, Integer(rec));
те не получается вызов из класса внутри dll (qrawc.dll) к функции из другой dll (qraVisualization.dll). Хотя повторюсь, внутри оконной процедуры вызов происходи нормально.
не помогло =(
Цитата: 0nni
не помогло =(
Что-то мне подсказывает, что у вас где-то "бьется" память, а именно при обращении к wnd вот здесь:
Код:
function TQraWndRec.GetIconSize: Integer;
begin
//result := 32;
result := VisualizationProc(wnd, QRA_VIS_ICONSIZE, 0, 0);
end;
begin
//result := 32;
result := VisualizationProc(wnd, QRA_VIS_ICONSIZE, 0, 0);
end;
Нужно проверить корректность создания экземпляра TQraWndRec.
Код:
var wc : TWndClass;
begin
ZeroMemory(@wc, SizeOf(wc));
wc.style := CS_DBLCLKS or CS_OWNDC;
wc.lpfnWndProc := @QraWndProc;
wc.cbClsExtra := 0;
[COLOR="Red"]wc.cbWndExtra := 0;[/COLOR]
wc.hInstance := HInst;
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hCursor := LoadCursor(0, IDC_ARROW);
wc.hbrBackground := COLOR_BTNFACE + 1;
wc.lpszMenuName := '';
wc.lpszClassName := 'QraWndClass';
begin
ZeroMemory(@wc, SizeOf(wc));
wc.style := CS_DBLCLKS or CS_OWNDC;
wc.lpfnWndProc := @QraWndProc;
wc.cbClsExtra := 0;
[COLOR="Red"]wc.cbWndExtra := 0;[/COLOR]
wc.hInstance := HInst;
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hCursor := LoadCursor(0, IDC_ARROW);
wc.hbrBackground := COLOR_BTNFACE + 1;
wc.lpszMenuName := '';
wc.lpszClassName := 'QraWndClass';
И как вас это нравится? особенно после этого
Код:
SetWindowLong(wnd, [COLOR="Red"]0[/COLOR], Integer(rec));
...
//и где то в коде
rec := Pointer(GetWindowLong(wnd, [COLOR="Red"]0[/COLOR]));
...
//и где то в коде
rec := Pointer(GetWindowLong(wnd, [COLOR="Red"]0[/COLOR]));
Спасибо!
зы. Вдумчивое жевание бутерброда с колбасой, таки стимулирует моск ;)
Ну, с кем не бывало :)