![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
В общем моё первое знакомство с динамическими библиотеками потерпело фиаско... В библиотеке описана процедура в которую передаётся переменная типа HDC и хэндл... примерно так:
Код:
procedure MyProc(var myDC: HDC; H: HWND); stdcall; Код:
procedure MyProc(var myDC: HDC; H: HWND); stdcall; begin ... myDC:= GetDC(H); ... end; Цитата:
Что тут не так? Где то я читал что вроде в библиотеку передаются не сами параметры, а лишь ссылки на них, но не уверен... Как быть? |
|
#2
|
|||
|
|||
|
Так и есть, параметры не передаются. Передаются только ссылки на них. И если память для должна освобождаться тем же процессом, которым выделилась.
Такой код ведёт к гадским мессагам:: //app.exe:: A:=TSomeObj.create; DllProc(a); //lib.dll:: procedure DllProc(a:TSomeObj); begin ... A.free ... end; |
|
#3
|
||||
|
||||
|
Счас попробуем...
|
|
#4
|
||||
|
||||
|
Что то я не понял... "A" - это что? HDC? У HDC же нет ни Create, ни Free...
|
|
#5
|
|||
|
|||
|
попробуй убрать "var" ибо ты передаёш ссылку на ссылку !!!
помоему так ... и пытаешся обратиться для получения контекста к адресу где хранится адрес контекста )) Но я точно не уверен ... |
|
#6
|
||||
|
||||
|
Цитата:
Вполне логично... HDC - это ссылка на контекст устройства. И я передаю ссылку на неё... м-да... Только var тут не поможет. Может кто знает как передавать такие вещи... PS: Если я уберу var то не получу обратно myDC, если только не сделаю процедуру функцией и буду возвращать DC результатом. Но там есть ещё myRC: HGLRC; (ссылка на контекст воспроизведения) и тут та же беда... Две ссылки в результ не запихнёшь... если и одну вообще возможно. |
|
#7
|
||||
|
||||
|
Почему не запихнешь? Создай свой тип-запись и передавай в нем сколько хочешь ссылок.
|
|
#8
|
||||
|
||||
|
Цитата:
![]() |
|
#9
|
||||
|
||||
|
AXS, приведите ВЕСЬ код процедуры, т.к. ошибка у вас явно не в этом месте. У меня этот код не вызывает никаких исключений.
|
|
#10
|
||||
|
||||
|
Код:
type TMyRec = record Wnd1, Wnd2, Wnd3, ...: HWND; Dc1, Dc2, Dc3, ...: HDC; end; ... procedure MyProc(Rec: TMyRec); Последний раз редактировалось The Shadow, 08.04.2008 в 11:29. |
|
#11
|
||||
|
||||
|
Цитата:
Код библиотеки: Код:
library sdcfunc;
uses
dglOpenGL, Windows, ShareMem;
procedure SetDCPixelFormat(dc: HDC); stdcall;
var
pfd:TPixelFormatDescriptor;
nPixelFormat:Integer;
begin
FillChar(pfd,SizeOf(pfd),0);
with pfd do
begin
nSize := sizeof(pfd);
nVersion := 1;
dwFlags := PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
iPixelType:= PFD_TYPE_RGBA;
cColorBits:= 24;
cDepthBits:= 64;
iLayerType:= PFD_MAIN_PLANE;
end;
nPixelFormat:=ChoosePixelFormat(DC,@pfd);
SetPixelFormat(DC,nPixelFormat,@pfd);
end;
procedure Initiate(var DC:HDC; var RC:HGLRC; Hndl:HWND; W,H,OrtZoom:Integer;
Persp, Mat, AAlias: Boolean); stdcall;
begin
InitOpenGL;
DC:=GetDC(Hndl);
SetDCPixelFormat(DC);
RC:=wglCreateContext(DC);
ActivateRenderingContext(DC, RC);
wglMakeCurrent(DC,RC);
glClearColor(1.0,1.0,1.0,1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
if Persp then
gluPerspective(40.0,W/H,1,12)
else
glOrtho(-OrtZoom/(H/W), OrtZoom/(H/W), -OrtZoom, OrtZoom, -4500, 4500);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
if mat then
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glEnable (GL_DEPTH_TEST);
glEnable( GL_AUTO_NORMAL);
glEnable (GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
if AAlias then
begin
glEnable(GL_POLYGON_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_OFFSET_FILL);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
end;
end;
procedure Finish(DC:HDC; RC:HGLRC; Hndl:HWND); stdcall;
begin
wglMakeCurrent(0,0);
DeactivateRenderingContext;
wglDeleteContext(RC);
ReleaseDC(Hndl,DC);
DeleteDC(DC);
end;
exports
Initiate,
Finish;
begin
end. |
|
#12
|
||||
|
||||
|
Цитата:
Просто инициализируем OpenGL во время создания и отпускаем в конце работы (лишнее убрал. падает то при инициализации...) Код:
unit ChildMod;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, dglOpenGL;
type
TChildForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
myRC:HGLRC;
myDC:HDC;
{ Private declarations }
public
{ Public declarations }
end;
var
ChildForm: TChildForm;
implementation
{$R *.dfm}
{ TChildForm }
procedure Initiate(var DC:HDC; var RC:HGLRC; Hndl:HWND; W,H,OrtZoom:Integer;
Persp, Mat, AAlias: Boolean); external 'sdcfunc';
procedure Finish(DC:HDC; RC:HGLRC; Hndl:HWND); external 'sdcfunc';
procedure TChildForm.FormCreate(Sender: TObject);
begin
Initiate(myDC,myRC,ChildForm.Handle,ChildForm.ClientWidth,ChildForm.ClientHeight,
10,true,true,true);
glTranslatef(0.0,0.0,-5.0);
end;
procedure TChildForm.FormDestroy(Sender: TObject);
begin
Finish(myDC,myRC,ChildForm.Handle);
end;
end. |
|
#13
|
|||
|
|||
|
слушай - а не проще вообще то определить класс который будет отвечать за инициализацию и т.д. и т.п.
и из dll возвращать его как результат функции инициализации... помоему более просто и понятно ... и не нужно тягать отдельные параметры, да и инициализировать можно бут более гибко чтоль... ![]() |
|
#14
|
||||
|
||||
|
Цитата:
Братцы! Хотя бы примерно. кусок кода. Тип-запись, класс... Я ж не даром в раздел "Начинающим" пишу. The Shadow спасибо за разъяснение по поводу Records, Всё понял с лёту. Теперь жду кода по поводу "определить класс"... |
|
#15
|
||||
|
||||
|
Ладно, с написанием класса я разобрался. Думаю смогу... Только не совсем догоняю чем это мне поможет?.. Если у вас есть мысли по поводу структуры класса - поделитесь пожалуйста. Но мне важно чтоб эти функции лежали вне самой программы т. к. программ-модулей использующих эти функции будет несколько и не хотелось бы писать их в каждой проге.
|