Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Duss
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
1

DLL (плагин) на Delphi

13.11.2012, 16:43. Просмотров 1224. Ответов 11
Метки нет (Все метки)

Есть заголовочный файл для создания длл на C (.h файл).
Хочу переложить структуры и сделать заголовочный файл для Delphi.
1-ая функция была переложена и реализована за 5 минут, со второй начались проблемы.

В 2-х словах:
DLL ждет передачи ему указателя на интерфейс в той функции.
C++
1
int APIENTRY Startup(Interface *servInt)
в Delphi объявил так:
Delphi
1
function Startup (var API : Interface) : integer; stdcall;
Пробовал комбинации с stdcall и убирать var, подскажите как правильно.

Тип Interface в .h имеет большое описание, все не буду выкладывать:

C++
1
2
3
4
5
struct CServerInterface
  {
   virtual int         __stdcall Version(void);
   //---            common functions
   virtual time_t      __stdcall Time(void);
и т.д.

Как это описать в Delphi?
struct - по идее аналог Record или Class, но я склоняюсь к объявлению ее как interface ?
Как будет правильнее?

И еще как на Delphi перевести тип вызова функции APIENTRY ?

Заранее премного благодарен.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2012, 16:43
Ответы с готовыми решениями:

Delphi dll
Написал на Delphi dll с функцией для переворачивания изображения лежащего в не сжатом виде без...

dll в Delphi
Доброго времени суток! Возникла необходимость в написании библиотеки (в ней ресурсы всякие и...

Delphi DLL ПОМОГИТЕ!
Нужно написать DLL: 1) Расстояние между двумя точками с координатами (x1, y1, z1) и (x2, y2, z2)...

Программа на delphi и библиотека dll на C++
Подскажите, как правильно передать масив (двумерный, трехмерный) у функцию из библиотеки, которая...

Экспортируемые функций DLL (С++ в Delphi)
Уважаемые программисты! У меня к Вам просьба, помогите разобраться с проблемой! Есть DLL...

11
mss
2638 / 2262 / 277
Регистрация: 24.12.2010
Сообщений: 13,725
13.11.2012, 17:01 2
Код
TServerInterface = interface
  function Version: Integer; stdcall;
...
end;
var заменить на out

цитата из windef.h:

#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
1
Duss
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
13.11.2012, 17:46  [ТС] 3
mss
Спасибо, продвинулся на шаг вперед)
Меня смутило
DLL ждет передачи ему указателя на интерфейс в той функции
(взято из скудного описания) да и я по логике тут должен получить интерфейс а не возвращать что-то
Из-за этого я не OUT даже не пробовал выставить.


цитата из windef.h:

#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
Не очень понял, с си не имею опыта практически.
В Delphi есть метод вызова функций stdcall и cdecl, но WINAPI же нет?

Добавлено через 12 минут
Цитата Сообщение от mss Посмотреть сообщение
Код
TServerInterface = interface
  function Version: Integer; stdcall;
...
end;
это, как я понял аналог этого кода на Delphi ?

Код
struct CServerInterface
{
virtual int __stdcall Version(void);
//--- common functions
virtual time_t __stdcall Time(void);
и т.д.
Но как тогда записать эту функцию?
Код
function Startup (out API : CServerInterface) : integer; stdcall;
0
mss
2638 / 2262 / 277
Регистрация: 24.12.2010
Сообщений: 13,725
13.11.2012, 17:53 4
Цитата Сообщение от Duss Посмотреть сообщение
и я по логике тут должен получить интерфейс а не возвращать что-то
По логике-то как раз возвращать надо.
Нафига плагину чужой интерфейс ?
Зачем плагину вызывать, скажем, метод Version того интерфейса, который ему якобы передается ?
Это хост-приложение, получив от плагина интерфейс, должно по идее вызывать Version для получения версии плагина.

есть метод вызова функций stdcall и cdecl, но WINAPI же нет?
Из цитаты виднор даже невооруженным глазом что APIENTRY есть псевдоним WINAPI, а WINAPI есть псевдоним stdcall. Так что в Delphi это будет stdcall.
0
Duss
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
13.11.2012, 18:03  [ТС] 5
Из цитаты виднор даже невооруженным глазом что APIENTRY есть псевдоним WINAPI, а WINAPI есть псевдоним stdcall. Так что в Delphi это будет stdcall.
Точно, спасибо!
Зачем плагину вызывать, скажем, метод Version того интерфейса, который ему якобы передается ?
Суть работы такая:
В плагине есть определенные функции, о которых знает хост и вызывает их при определенных событиях, а вот манипуляциями с хостовым интерфейсом плагин может реагировать на эти события.
Тут версия как раз хоста, свою версию плагин сообщает в другой функции, она вызвывалась ранее с ней у меня проблем не возникло.

Код
procedure SrvAbout (out info : PluginInfo); stdcall;
begin
  info.name := 'Test1';
  info.version := 11;
  info.copyright := 'Test1';
end;
С++
Код
void APIENTRY        SrvAbout(PluginInfo* info);
причем хост принял отправленные ему данные и я смог их увидеть.
0
mss
2638 / 2262 / 277
Регистрация: 24.12.2010
Сообщений: 13,725
13.11.2012, 18:09 6
Код
IServerInterface = interface
  function Version: Integer; stdcall;
...
end;

TServerInterface = class(TIterfacedObject, IServerInterface)
...
end;

function Startup (out API : IServerInterface) : integer; stdcall;
begin
..
  API := TServerInterface.Create as IServerInterface;
  Result := ..;
..
end;
Добавлено через 5 минут
В плагине есть определенные функции, о которых знает хост и вызывает их при определенных событиях, а вот манипуляциями с хостовым интерфейсом плагин может реагировать на эти события
Ну тогда действительно ни var ни out не нужны. Но вероятно указать const будет не лишним - неизвестно как хост реагирует на подсчет ссылок на переданный им интерфейс. При const компилятор не вставляет код управления счетчиком ссылок.
0
саша40
-110 / 294 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
13.11.2012, 20:19 7
Цитата Сообщение от Duss Посмотреть сообщение
Есть заголовочный файл для создания длл на C (.h файл).
Вы хотите сказать, код файла .h надо переписать в модуль или dll в delphi?

Не по теме:

Насчет .h файлов:
Эти файлы, это и есть модули, просто в Delphi они .pas. Вы слыхали хотябы что языки программирования похожы?

0
Somebody
2809 / 1620 / 251
Регистрация: 03.12.2007
Сообщений: 4,223
Завершенные тесты: 3
13.11.2012, 20:41 8
.h - это больше похоже раздел "interface" модуля, а "implementation" большей частью в .c.
0
Duss
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
13.11.2012, 21:04  [ТС] 9
Насчет .h файлов:
Эти файлы, это и есть модули, просто в Delphi они .pas. Вы слыхали хотябы что языки программирования похожы?
Ну а я про что пишу?
Есть модуль на си .h, а нужно сделать модуль на .pas

Цитата Сообщение от mss Посмотреть сообщение
Код
IServerInterface = interface
  function Version: Integer; stdcall;
...
end;

TServerInterface = class(TIterfacedObject, IServerInterface)
...
end;

function Startup (out API : IServerInterface) : integer; stdcall;
begin
..
  API := TServerInterface.Create as IServerInterface;
  Result := ..;
..
end;
К сожалению не смог запустить код.
Компилятор ругается, что не знает что такое TIterfacedObject

Есть пример функции Startup на си:

Код
int APIENTRY SrvStartup(CServerInterface *server)
  {
//--- check version
   if(server==NULL)                        return(FALSE);
   if(server->Version()!=ServerApiVersion) return(FALSE);
//--- save server interface link
   ExtServer=server;
//--- initialize dealer helper
   ExtProcessor.Initialize();
//---
   return(TRUE);
  }
0
mss
2638 / 2262 / 277
Регистрация: 24.12.2010
Сообщений: 13,725
13.11.2012, 21:20 10
Цитата Сообщение от саша40 Посмотреть сообщение
Вы слыхали хотябы что языки программирования похожы?
Когда ж ты уймешься ?)
Каждой бочке дырявая затычка)

Цитата Сообщение от Duss Посмотреть сообщение
не смог запустить код
Он уже не актуален.

Цитата Сообщение от Duss Посмотреть сообщение
Компилятор ругается, что не знает что такое TIterfacedObject
TInterfacedObject
0
Duss
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
14.11.2012, 12:44  [ТС] 11
Цитата Сообщение от mss Посмотреть сообщение
Он уже не актуален.
Он был бы актуален, если бы я передавал интерфейс?

Возможно не работает из-за того что я не полностью описал CServerInterface ?
Он довольно большой, я описал несколько первых функций, они же должны работать?

Из кода выше
ExtServer объявлен как:
Код
CServerInterface *ExtServer=NULL;
Как я понял
Код
ExtServer=server;
- сохраняют интерфейс в глобальной переменной, чтобы использовать в других функциях?

И я не знаю что такое ExtProcessor ? Вроде не объявлен нигде, используется в других функциях, может это что-то стандартное при работе с DLL?

P.S. наверно полезу ставить вижуал студию, так наверно проще будет
0
mss
2638 / 2262 / 277
Регистрация: 24.12.2010
Сообщений: 13,725
14.11.2012, 13:06 12
Цитата Сообщение от Duss Посмотреть сообщение
Он был бы актуален, если бы я передавал интерфейс?
Да.


Цитата Сообщение от Duss Посмотреть сообщение
сохраняют интерфейс в глобальной переменной, чтобы использовать в других функциях?
Да.


Цитата Сообщение от Duss Посмотреть сообщение
что такое ExtProcessor ?
Видимо какой-то внутренний объект, объявленный и реализованный в самой плагин-dll.
Т.е. это какой-то объект, не имеющий прямого отношения к хост-приложению.


Цитата Сообщение от Duss Посмотреть сообщение
не работает
Отладчик покажет что именно не работает.
Я лишь сделал предположение что судя по virtual в оригинальной декларации сишной структуры CServerInterface дельфийским ее эквивалентом может быть штатное объявление интерфейса.
1
14.11.2012, 13:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2012, 13:06

DELPHI+DLL+ системное меню
Добрый вечер Дамы и Господа! Я ищу решение небольшой проблемы, думаю, что оно не очень сложное, но...

dll в delphi
Ребят помогите мне разобраться с dll, уже второй день сижу, а въехать в суть дел не могу :(. Вот...

ISAPI DLL в Delphi
Помогите пожалуйста !!!! Такая трабла , создаю Isapi dll, вообще мне нужно сделать селект из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru