Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.04.2008, 18:42
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
Вопрос Проблема с процедурой в DLL

В общем моё первое знакомство с динамическими библиотеками потерпело фиаско... В библиотеке описана процедура в которую передаётся переменная типа HDC и хэндл... примерно так:
Код:
procedure MyProc(var myDC: HDC; H: HWND); stdcall;
далее пытаемся заполучить нужный нам контекст:
Код:
procedure MyProc(var myDC: HDC; H: HWND); stdcall;
begin
  ...
  myDC:= GetDC(H);
  ...
end;
Вот при этом самом получении и вылазит гадкая мессага
Цитата:
Проект *******.exe вызвал исключение класса EAccessViolation с сообщением 'Access violation at address 003AE363 in module '******.dll'. Read of address 00000001'. Процесс остановлен. Используйте Шаг или Запуск для продолжения.

Что тут не так? Где то я читал что вроде в библиотеку передаются не сами параметры, а лишь ссылки на них, но не уверен... Как быть?
Ответить с цитированием
  #2  
Старый 02.04.2008, 19:16
hinst hinst вне форума
Прохожий
 
Регистрация: 02.04.2008
Сообщения: 2
Репутация: 10
Сообщение

Так и есть, параметры не передаются. Передаются только ссылки на них. И если память для должна освобождаться тем же процессом, которым выделилась.
Такой код ведёт к гадским мессагам::

//app.exe::
A:=TSomeObj.create;
DllProc(a);

//lib.dll::
procedure DllProc(a:TSomeObj);
begin
...
A.free
...
end;
Ответить с цитированием
  #3  
Старый 02.04.2008, 19:44
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
По умолчанию

Счас попробуем...
Ответить с цитированием
  #4  
Старый 02.04.2008, 20:24
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
По умолчанию

Что то я не понял... "A" - это что? HDC? У HDC же нет ни Create, ни Free...
Ответить с цитированием
  #5  
Старый 02.04.2008, 21:08
K735Demon K735Demon вне форума
Прохожий
 
Регистрация: 30.03.2008
Сообщения: 10
Репутация: 10
По умолчанию

попробуй убрать "var" ибо ты передаёш ссылку на ссылку !!!
помоему так ...
и пытаешся обратиться для получения контекста к адресу где хранится адрес контекста ))
Но я точно не уверен ...
Ответить с цитированием
  #6  
Старый 03.04.2008, 22:03
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
По умолчанию

Цитата:
Сообщение от K735Demon
попробуй убрать "var" ибо ты передаёш ссылку на ссылку !!!
помоему так ...
и пытаешся обратиться для получения контекста к адресу где хранится адрес контекста ))
Но я точно не уверен ...

Вполне логично... HDC - это ссылка на контекст устройства. И я передаю ссылку на неё... м-да... Только var тут не поможет.
Может кто знает как передавать такие вещи...

PS: Если я уберу var то не получу обратно myDC, если только не сделаю процедуру функцией и буду возвращать DC результатом. Но там есть ещё myRC: HGLRC; (ссылка на контекст воспроизведения) и тут та же беда... Две ссылки в результ не запихнёшь... если и одну вообще возможно.
Ответить с цитированием
  #7  
Старый 04.04.2008, 20:02
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Почему не запихнешь? Создай свой тип-запись и передавай в нем сколько хочешь ссылок.
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #8  
Старый 07.04.2008, 22:06
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
По умолчанию

Цитата:
Сообщение от The Shadow
Почему не запихнешь? Создай свой тип-запись и передавай в нем сколько хочешь ссылок.
Можно на примере (кусок кода)... А то я первый раз с этим столкнулся...
Ответить с цитированием
  #9  
Старый 08.04.2008, 00:19
Аватар для zip000
zip000 zip000 вне форума
Начинающий
 
Регистрация: 24.07.2007
Сообщения: 194
Репутация: 25
По умолчанию

AXS, приведите ВЕСЬ код процедуры, т.к. ошибка у вас явно не в этом месте. У меня этот код не вызывает никаких исключений.
__________________
Не профи, но и не чайник . D6 - лучше не придумали. Пока.
Ответить с цитированием
  #10  
Старый 08.04.2008, 11:26
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Код:
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  
Старый 11.04.2008, 19:37
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
По умолчанию

Цитата:
Сообщение от zip000
AXS, приведите ВЕСЬ код процедуры, т.к. ошибка у вас явно не в этом месте. У меня этот код не вызывает никаких исключений.

Код библиотеки:
Код:
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  
Старый 11.04.2008, 19:45
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
По умолчанию

Цитата:
Сообщение от zip000
AXS, приведите ВЕСЬ код процедуры, т.к. ошибка у вас явно не в этом месте. У меня этот код не вызывает никаких исключений.
Код юнита:
Просто инициализируем 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  
Старый 12.04.2008, 10:12
K735Demon K735Demon вне форума
Прохожий
 
Регистрация: 30.03.2008
Сообщения: 10
Репутация: 10
По умолчанию здравствуйте

слушай - а не проще вообще то определить класс который будет отвечать за инициализацию и т.д. и т.п.
и из dll возвращать его как результат функции инициализации...
помоему более просто и понятно ... и не нужно тягать отдельные параметры, да и инициализировать можно бут более гибко чтоль...
Ответить с цитированием
  #14  
Старый 12.04.2008, 21:27
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
По умолчанию

Цитата:
Сообщение от K735Demon
слушай - а не проще вообще то определить класс который будет отвечать за инициализацию и т.д. и т.п.
и из dll возвращать его как результат функции инициализации...
помоему более просто и понятно ... и не нужно тягать отдельные параметры, да и инициализировать можно бут более гибко чтоль...
Братцы! Хотя бы примерно. кусок кода. Тип-запись, класс... Я ж не даром в раздел "Начинающим" пишу. The Shadow спасибо за разъяснение по поводу Records, Всё понял с лёту. Теперь жду кода по поводу "определить класс"...
Ответить с цитированием
  #15  
Старый 14.04.2008, 20:05
Аватар для AXS
AXS AXS вне форума
Новичок
 
Регистрация: 26.11.2006
Адрес: РК г. Талдыкорган
Сообщения: 67
Репутация: 15
По умолчанию

Ладно, с написанием класса я разобрался. Думаю смогу... Только не совсем догоняю чем это мне поможет?.. Если у вас есть мысли по поводу структуры класса - поделитесь пожалуйста. Но мне важно чтоб эти функции лежали вне самой программы т. к. программ-модулей использующих эти функции будет несколько и не хотелось бы писать их в каждой проге.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:28.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter