|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Проблема с процедурой в DLL
В общем моё первое знакомство с динамическими библиотеками потерпело фиаско... В библиотеке описана процедура в которую передаётся переменная типа 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
|
||||
|
||||
Почему не запихнешь? Создай свой тип-запись и передавай в нем сколько хочешь ссылок.
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#8
|
||||
|
||||
Цитата:
|
#9
|
||||
|
||||
AXS, приведите ВЕСЬ код процедуры, т.к. ошибка у вас явно не в этом месте. У меня этот код не вызывает никаких исключений.
Не профи, но и не чайник . D6 - лучше не придумали. Пока. |
#10
|
||||
|
||||
Код:
type TMyRec = record Wnd1, Wnd2, Wnd3, ...: HWND; Dc1, Dc2, Dc3, ...: HDC; end; ... procedure MyProc(Rec: TMyRec); Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. Последний раз редактировалось 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
|
||||
|
||||
Цитата:
|
#15
|
||||
|
||||
Ладно, с написанием класса я разобрался. Думаю смогу... Только не совсем догоняю чем это мне поможет?.. Если у вас есть мысли по поводу структуры класса - поделитесь пожалуйста. Но мне важно чтоб эти функции лежали вне самой программы т. к. программ-модулей использующих эти функции будет несколько и не хотелось бы писать их в каждой проге.
|