Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов функции из Dll внутри класса.

3.7K
27 ноября 2008 года
0nni
326 / / 24.06.2008
Чувствую что где то накосячил, но не пойму где...
Суть в том что функция (статическая линковка, stdcall вызов) нормально вызывается из оконной процедуры но когда пытаюсь вызвать ее внутри процедуры класса - вылетает "RunTime error 216".

Вот этот код работает отлично.
Код:
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;


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;


если заменить в 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;
5
27 ноября 2008 года
hardcase
4.5K / / 09.08.2005
А что между строками?
Цитата: 0nni

 
Код:
function VisualizationProc(Wnd : HWND; msg : Cardinal; wParam, lParam : Integer) : Integer; stdcall;
....
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.
3.7K
27 ноября 2008 года
0nni
326 / / 24.06.2008
 
Код:
interface

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));

те не получается вызов из класса внутри dll (qrawc.dll) к функции из другой dll (qraVisualization.dll). Хотя повторюсь, внутри оконной процедуры вызов происходи нормально.

не помогло =(
5
27 ноября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: 0nni

не помогло =(

Что-то мне подсказывает, что у вас где-то "бьется" память, а именно при обращении к wnd вот здесь:

 
Код:
function TQraWndRec.GetIconSize: Integer;
begin
    //result := 32;
    result := VisualizationProc(wnd, QRA_VIS_ICONSIZE, 0, 0);
end;

Нужно проверить корректность создания экземпляра TQraWndRec.
3.7K
27 ноября 2008 года
0nni
326 / / 24.06.2008
Упс :D, берите выше - проверить корректность регистрации класса.
Код:
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';

И как вас это нравится? особенно после этого
 
Код:
SetWindowLong(wnd, [COLOR="Red"]0[/COLOR], Integer(rec));
...
//и где то в коде
rec := Pointer(GetWindowLong(wnd, [COLOR="Red"]0[/COLOR]));

Спасибо!
зы. Вдумчивое жевание бутерброда с колбасой, таки стимулирует моск ;)
5
28 ноября 2008 года
hardcase
4.5K / / 09.08.2005
Ну, с кем не бывало :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог