Страница 1 из 3
вызов dll
Добавлено: 24.09.2010 15:03:05
danya
здравствуйте.
подскажите пожалуйста что почитать по работе с dll
есть библиотека написанная на С
мне нужно выполнить её вызов и в дальнейшем работать с её функциями
сама библиотека и её исходники находятся
тут
Re: вызов dll
Добавлено: 24.09.2010 15:30:28
Nik
Один из вариантов - статический вызов функций.
В секции interface пишете что-то вроде этого:
function FunctionFromDll(parametr: string): integer; external 'MyDll';
Далее пользуетесь функцией как обычной.
Re: вызов dll
Добавлено: 24.09.2010 16:02:49
danya
ок спасибо это я понял теперь
но мне нужно подключить длл и выполнить сначала одну функцию а затем уже вторую:
BOOL WINAPI SSQ_SetGameServer(char* address);
DWORD WINAPI SSQ_Ping();
Re: вызов dll
Добавлено: 24.09.2010 16:11:16
stikriz
danya писал(а):но мне нужно подключить длл и выполнить сначала одну функцию а затем уже вторую:
Ну, если предыдущее опнятно, то в чем проблема объявить и вторую функцию рядом на следующей строчке?
Re: вызов dll
Добавлено: 24.09.2010 16:36:52
danya
ну дело в том что появились сомнения

ведь вторая функция выполняется только после первой
Re: вызов dll
Добавлено: 24.09.2010 19:19:00
Nik
Объявление никак не связано с последующими вызовами. Все нужные функции объявляются в одном месте, а потом уж используйте хоть оптом, хоть в розницу

Re: вызов dll
Добавлено: 24.09.2010 19:27:32
danya
хорошо

тогда последний вопрос)
в документации к библиотеке написано:
DWORD WINAPI SSQ_Ping();
то бишь как я понял переменная типа dword как её преобразовать для вывода в TLabel
при выводе говорит что ожидается TTranslateString, но ничего вразумительного найти не могу
Re: вызов dll
Добавлено: 24.09.2010 23:43:12
Nik
DWORD, если мне память не изменяет, это целочисленный тип. Должно помочь преобразование IntToStr.
при выводе говорит что ожидается TTranslateString
При выводе куда?
Добавлено спустя 2 минуты 12 секунд:Вообще у вас что-то типа этого должно получиться:
Код: Выделить всё
procedure SSQ_Ping: integer; external 'MyDll';
...
var
x: integer;
begin
x:=SSQ_Ping;
xLabel.Caption:=IntToStr(x);
end;
Re: вызов dll
Добавлено: 25.09.2010 12:28:52
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
Re: вызов dll
Добавлено: 26.09.2010 15:13:43
danya
исправил сам но работает через раз
а как использовать классы из .NET??
Re: вызов dll
Добавлено: 27.09.2010 08:52:04
Andrew
Здравствуйте,
не хочу плодить тем, по этому спрошу здесь
пытаюсь написать простенький шаблон для создания плагинов с помощью динамически подключаемых библиотек.
Написал простенькую библиотеку и программу для проверок
загрузка библиотеки, инициализация application и показ формы работают нормально, но если я передаю данные,
то считываются совершенно другое значение, пробовал передавать PCHAR, INTEGER и pointer
исходники прилагаю
p.s. использовал материал
http://freepascal.ru/article//freepasca ... 522025034/пробовал по виндой на Lazarus-0.9.29-27341-fpc-2.4.3-20100913
под линуксом не пробовал пока некогда
Re: вызов dll
Добавлено: 27.09.2010 08:55:04
Kitayets
2danya
исправил сам но работает через раз
напиши хоть в чём ошибка была, может кому нибудь поможет.
а как использовать классы из .NET??
классы из .NET, может использовать только .NET приложение. из java только jvm приложение. Даже c++ классы напрямую нельзя из fpc использовать.
Re: вызов dll
Добавлено: 27.09.2010 10:27:16
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;
помучав немного стало работать как надо но программа почему-то через определённое время зависает
никто не знает как вылечить??
Re: вызов dll
Добавлено: 27.09.2010 10:34:03
Mr.Smart
danya
тип: char * не соответствует типу String!
Re: вызов dll
Добавлено: 27.09.2010 11:32:15
danya
а разве в си есть стринг?
как же тогда исправить?? подскажите пожалуйста а то си нас учили уже давненько да и не сказал бы что хорошо
