Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Процедурный тип для вызова внешней подпрограммы, нужно перевести с С на Delphi 
:(
    Опции темы
Чупакабро
Дата 15.6.2011, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Hi all!
Нужно вот эту радость перевести с С на Delphi:

Код

typedef void (APIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
typedef void (APIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
typedef void (APIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
typedef void (APIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, int size, const GLvoid *data, GLenum usage);

PFNGLGENBUFFERSARBPROC glGenBuffersARB = NULL; // VBO Name Generation Procedure
PFNGLBINDBUFFERARBPROC glBindBufferARB = NULL; // VBO Bind Procedure
PFNGLBUFFERDATAARBPROC glBufferDataARB = NULL; // VBO Data Loading Procedure
PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = NULL;


Смысл в чем: объявляются процедурные типы, потом процедурные переменные. Далее идут вызовы процедур (я их здесь не привел).
Тут одна маленькая загвоздочка: эти процедуры описаны не в моей программе, а в драйвере видеокарты (насколько я понял). И их адреса возвращает функция wglGetProcAddress. Адреса-то она возвращает, только при попытке вызова процедур по этим адресам происходит исключение Access violation.

мой вариант перевода такой:
Код

  PFNGLGENBUFFERSARBPROC=procedure(n:GLsizei;buffers:pGLuint);
  PFNGLBINDBUFFERARBPROC=procedure(target:GLEnum;buffer:GLuint);
  PFNGLBUFFERDATAARBPROC=procedure(target:GLenum;size:GLsizei;data:pGLuint;usage:GLenum);
  PFNGLDELETEBUFFERSARBPROC=procedure(n:glsizei;buffers:pgluint);

var
  glGenBuffers:^PFNGLGENBUFFERSARBPROC=nil;
  glBindBuffer:^PFNGLBINDBUFFERARBPROC=nil;
  glBufferData:^PFNGLBUFFERDATAARBPROC=nil;
  glDeleteBuffers:^PFNGLDELETEBUFFERSARBPROC=nil;

и вот не пойму, в чем загвоздка, так как я не очень хорошо знаю Delphi, а уж С знаю совсем плохо.

--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Чучмек
Дата 15.6.2011, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41




 без ^ !!!
Код

var
  glGenBuffers:PFNGLGENBUFFERSARBPROC=nil;
  glBindBuffer:PFNGLBINDBUFFERARBPROC=nil;
  glBufferData:PFNGLBUFFERDATAARBPROC=nil;
  glDeleteBuffers:PFNGLDELETEBUFFERSARBPROC=nil;


Это сообщение отредактировал(а) Чучмек - 15.6.2011, 22:27


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чупакабро
Дата 15.6.2011, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Спасибище ОГРОМНОЕ!!!
Вот я тупой, процедурный тип - сам по себе указатель!
Заработало!))
p.s. ну и stdcall само собой...

Это сообщение отредактировал(а) Чупакабро - 15.6.2011, 22:35
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Чучмек
Дата 15.6.2011, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Кроме того может быть  stdcall
Код

  PFNGLGENBUFFERSARBPROC=procedure(n:GLsizei;buffers:pGLuint);stdcall;
  PFNGLBINDBUFFERARBPROC=procedure(target:GLEnum;buffer:GLuint);stdcall;
  PFNGLBUFFERDATAARBPROC=procedure(target:GLenum;size:GLsizei;data:pGLuint;usage:GLenum);stdcall;
  PFNGLDELETEBUFFERSARBPROC=procedure(n:glsizei;buffers:pgluint);stdcall;


на будующее...

Это сообщение отредактировал(а) Чучмек - 15.6.2011, 22:36


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чупакабро
Дата 15.6.2011, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



попробовал))
программо работает:
 
Код

 PFNGLGENBUFFERSARBPROC=procedure(n:GLsizei;buffers:pGLuint);stdcall;
  PFNGLBINDBUFFERARBPROC=procedure(target:GLEnum;buffer:GLuint);stdcall;
  PFNGLBUFFERDATAARBPROC=procedure(target:GLenum;size:GLsizei;data:pGLuint;usage:GLenum);stdcall;
  PFNGLDELETEBUFFERSARBPROC=procedure(n:glsizei;buffers:pgluint);stdcall;
var
  glGenBuffers:PFNGLGENBUFFERSARBPROC=nil;
  glBindBuffer:PFNGLBINDBUFFERARBPROC=nil;
  glBufferData:PFNGLBUFFERDATAARBPROC=nil;
  glDeleteBuffers:PFNGLDELETEBUFFERSARBPROC=nil;


Это сообщение отредактировал(а) Чупакабро - 15.6.2011, 22:42

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  ___.JPG 194,36 Kb
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0439 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.