вызов dll

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

danya
незнакомец
Сообщения: 9
Зарегистрирован: 24.09.2010 14:58:53

вызов dll

Сообщение danya »

здравствуйте.
подскажите пожалуйста что почитать по работе с dll
есть библиотека написанная на С
мне нужно выполнить её вызов и в дальнейшем работать с её функциями
сама библиотека и её исходники находятся тут
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Один из вариантов - статический вызов функций.

В секции interface пишете что-то вроде этого:

function FunctionFromDll(parametr: string): integer; external 'MyDll';


Далее пользуетесь функцией как обычной.
danya
незнакомец
Сообщения: 9
Зарегистрирован: 24.09.2010 14:58:53

Сообщение danya »

ок спасибо это я понял теперь
но мне нужно подключить длл и выполнить сначала одну функцию а затем уже вторую:
BOOL WINAPI SSQ_SetGameServer(char* address);
DWORD WINAPI SSQ_Ping();
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

danya писал(а):но мне нужно подключить длл и выполнить сначала одну функцию а затем уже вторую:

Ну, если предыдущее опнятно, то в чем проблема объявить и вторую функцию рядом на следующей строчке?
danya
незнакомец
Сообщения: 9
Зарегистрирован: 24.09.2010 14:58:53

Сообщение danya »

ну дело в том что появились сомнения :)
ведь вторая функция выполняется только после первой
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Объявление никак не связано с последующими вызовами. Все нужные функции объявляются в одном месте, а потом уж используйте хоть оптом, хоть в розницу :)
danya
незнакомец
Сообщения: 9
Зарегистрирован: 24.09.2010 14:58:53

Сообщение danya »

хорошо :)
тогда последний вопрос)
в документации к библиотеке написано:
DWORD WINAPI SSQ_Ping();
то бишь как я понял переменная типа dword как её преобразовать для вывода в TLabel
при выводе говорит что ожидается TTranslateString, но ничего вразумительного найти не могу
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

DWORD, если мне память не изменяет, это целочисленный тип. Должно помочь преобразование IntToStr.

при выводе говорит что ожидается TTranslateString

При выводе куда?

Добавлено спустя 2 минуты 12 секунд:
Вообще у вас что-то типа этого должно получиться:

Код: Выделить всё

procedure SSQ_Ping: integer; external 'MyDll';

...

var
 x: integer;
begin
 x:=SSQ_Ping;
 xLabel.Caption:=IntToStr(x);
end;
danya
незнакомец
Сообщения: 9
Зарегистрирован: 24.09.2010 14:58:53

Сообщение danya »

спасибо что-то типо этого и было у меня но ошибки были :)
теперь функция возвращает значение -1 т.е. всё хорошо
не поможете теперь со следующим??

Код: Выделить всё

BOOL WINAPI SSQ_SetGameServer(char* address);
Parameters

[in]address
   The address of the game server to set. Can be a numerical address with port or a hostname address with port in the form "127.0.0.1:27015" or "localhost:27015".

Return Values

If the function succeeds the return value is TRUE.

If the function fails the return value is FALSE.


объявил функцию

Код: Выделить всё

function SSQ_SetGameServer(address:string):boolean;
external 'SSQ';

затем делаю вызов

Код: Выделить всё

var ping_success:boolean;
begin
ping_success:=SSQ_SetGameServer('217.198.1.76:27038');

но из-за этого кода прога падает с ошибкой Acess Vialation
danya
незнакомец
Сообщения: 9
Зарегистрирован: 24.09.2010 14:58:53

Сообщение danya »

исправил сам но работает через раз
а как использовать классы из .NET??
Andrew
новенький
Сообщения: 14
Зарегистрирован: 15.01.2008 22:21:26

Сообщение Andrew »

Здравствуйте,
не хочу плодить тем, по этому спрошу здесь
пытаюсь написать простенький шаблон для создания плагинов с помощью динамически подключаемых библиотек.
Написал простенькую библиотеку и программу для проверок
загрузка библиотеки, инициализация application и показ формы работают нормально, но если я передаю данные,
то считываются совершенно другое значение, пробовал передавать PCHAR, INTEGER и pointer
исходники прилагаю
p.s. использовал материал http://freepascal.ru/article//freepasca ... 522025034/
пробовал по виндой на Lazarus-0.9.29-27341-fpc-2.4.3-20100913
под линуксом не пробовал пока некогда
Вложения
modules.zip
исходники модуля
(160.82 КБ) 534 скачивания
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

2danya

исправил сам но работает через раз

напиши хоть в чём ошибка была, может кому нибудь поможет.
а как использовать классы из .NET??

классы из .NET, может использовать только .NET приложение. из java только jvm приложение. Даже c++ классы напрямую нельзя из fpc использовать.
danya
незнакомец
Сообщения: 9
Зарегистрирован: 24.09.2010 14:58:53

Сообщение danya »

оформил функции так:

Код: Выделить всё

function SSQ_Ping:integer; stdcall;
  external 'SSQ.dll' name 'SSQ_Ping';
  function SSQ_SetGameServer(address:string):boolean; stdcall;
  external 'SSQ.dll' name 'SSQ_SetGameServer';               

и их вызов так

Код: Выделить всё

 address:='simhost.org:27036';
 ping_success:=SSQ_SetGameServer(address);

Код: Выделить всё

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 ping_success:=false;
 ping:=SSQ_Ping;
 Label1.Caption:=IntToStr(ping);
 init:=SSQ_Initialize(false);
end; 

помучав немного стало работать как надо но программа почему-то через определённое время зависает
никто не знает как вылечить??
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

danya
тип: char * не соответствует типу String!
danya
незнакомец
Сообщения: 9
Зарегистрирован: 24.09.2010 14:58:53

Сообщение danya »

а разве в си есть стринг?
как же тогда исправить?? подскажите пожалуйста а то си нас учили уже давненько да и не сказал бы что хорошо :)
Ответить