Среда, 06 Ноября 2024, 03:06

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Использовать функции из dll
VinchensooДата: Воскресенье, 19 Декабря 2010, 18:59 | Сообщение # 1
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Добрый день. Нужен код для консольного приложения на дельфи.
Нужно объявить функцию из dll, чтобы можно было ее использовать далее в программе.
В коде нужно показать, как вообще объявляется и интегрируется dll, как исп. ее функции.
Кто поможет- + в репу


BOOMДата: Воскресенье, 19 Декабря 2010, 19:04 | Сообщение # 2
I am the creator of ADE
Сейчас нет на сайте
Vinchensoo, посмотри эти статейки:
на www.delphisources.ru
и на www.sql.ru.

З.Ы.
Я сейчас сам ищу по подобию, но для C++. Ведь постоянно подводить __stdcall под функцию будет сложно.


______________________________
Я вернулся, и это чудо.
______________________________
LorderonДата: Воскресенье, 19 Декабря 2010, 19:07 | Сообщение # 3
старожил
Сейчас нет на сайте
Vinchensoo, посмотри здесь. Очень полезно. Сам в этом не разбирался, но думаю ты разберешься.
AngevengelistДата: Воскресенье, 19 Декабря 2010, 19:20 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
После uses описывай необходимые процедуры
Code
Procedure LaLaLa; stdcall; external 'Mylib.dll';

Procedure TraLaLa; stdcall; external 'Mylib.dll';

В программе вызывай

Code
begin
   LaLaLa;
end.

Простейшее приложение(консольное):

Code
program Project2;

{$APPTYPE CONSOLE}

uses
    SysUtils;

Procedure LaLaLa; stdcall; external 'Mylib.dll'; // вызов процедуры LaLaLA из библиотеки Mylib.dll

Procedure TraLaLa; stdcall; external 'Mylib.dll';//вызов процедуры TraLaLA из библиотеки Mylib.dll

begin

   LaLaLa; // использование процедуры LaLaLa
   TraLaLa; // использование процедуры TraLaLa;

readln;
end.


Сообщение отредактировал Angevengelist - Воскресенье, 19 Декабря 2010, 19:21
VinchensooДата: Воскресенье, 19 Декабря 2010, 20:59 | Сообщение # 5
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Angevengelist, подразумевается, что процедура LaLaLa так и называется в dll?
BOOM, еще читаю статьи Акулова, вещь жесткая, много чего есть, но не все понятно. Там на программиста высокого уровня все-таки smile
Программа Delphi World
Lorderon, ок,спс, ознакомлюсь.
Хотя способ Angevengelist понравился, завтра проверю


AngevengelistДата: Понедельник, 20 Декабря 2010, 11:52 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Quote (Vinchensoo)
Angevengelist, подразумевается, что процедура LaLaLa так и называется в dll?

Да именно.

Quote (BOOM)
Я сейчас сам ищу по подобию, но для C++. Ведь постоянно подводить __stdcall под функцию будет сложно.

Способ похожий на Паскаль но для С++


Сообщение отредактировал Angevengelist - Понедельник, 20 Декабря 2010, 11:53
VinchensooДата: Понедельник, 10 Января 2011, 08:49 | Сообщение # 7
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Итак, попробовал предложенные способы, возникла следующая трабла:

Код проекта:
Code
program dll;

{$APPTYPE CONSOLE}

uses
      SysUtils;

Function tcpconnect(ip:string;port,mode:longint):longint; cdecl; external '39dll.dll';

begin
tcpconnect('127.0.0.1',4000,1);
readln;
end.

Название функции железно правильное, кол-во и типы аргументов- тоже.
С либой идет исходник на C++ и скрипт подключения для гм, поэтому скопипастил название функции и кол-во аргументов оттуда.
Подвох только в том, что в гм есть 2 типа переменных- реал и стринг.
Поэтому я пробовал все числовые типы- word, single, integer, real, в прикрепленном проекте- longint.
Вряд ли в этом проблема.
Проект с dll прикреплен в конце сообщения.
Stdcall исправил на cdecl, прочел в собрании статей дельфи ворлд. Хотя и stdcall пробовал, таже проблема.
Варианты, как поправить?
Прикрепления: 8967067.txt (0.2 Kb) · 0946233.jpg (84.9 Kb) · 8670275.rar (28.8 Kb)


ФилДата: Понедельник, 10 Января 2011, 11:37 | Сообщение # 8
Томатный революционер
Сейчас нет на сайте
Vinchensoo, интересная тема, сам ей интересуюсь :^)
Вот нарыл кое-что в интернете:

Ошибок во всяком случае не вызывает

upd
Вот все команды и исходник


Исходник (http://forum.gmclan.org/index.php?showtopic=9400&pid=132197&st=0&#entry132197)


Сообщение отредактировал Фил - Понедельник, 10 Января 2011, 11:42
karuyДата: Понедельник, 10 Января 2011, 12:27 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
Vinchensoo, то что ты написал просто неправильно,поетому и не работает, счас выложу робочий вариант. Сразу видно что з длл"ками не работал)

Добавлено (10.01.2011, 12:27)
---------------------------------------------
Во первых запомни, что вызывать функцыю нужно точно по имени которому она там записана (чуствительность к регистру символов), впринцыпе ето единственная ошыбка которая была, правда пришлось декомпильнуть длл"ку чтоб понять как именно функцыя звется. smile Держы
---------------------------------------------
пс еще запомни: такая ошибка возникает когда нет вызываемой функцыи в длл"ке, сюда же относиться регистр символов и к-во параметров.

Сообщение отредактировал karuy - Понедельник, 10 Января 2011, 12:29
ФилДата: Понедельник, 10 Января 2011, 12:48 | Сообщение # 10
Томатный революционер
Сейчас нет на сайте
karuy, а как мы узнаем точные регистры остальных функций? Может вы по доброте душевной выложите их здесь? :D
VinchensooДата: Понедельник, 10 Января 2011, 13:12 | Сообщение # 11
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Quote (Фил)
karuy, а как мы узнаем точные регистры остальных функций? Может вы по доброте душевной выложите их здесь? :D

Вот как хз, я даже исходники смотрел и проглядел регистр этот. Самое интересное, в гмл она вызывается спокойно, когда вводишь все маленькими буквами.
Quote (karuy)
Vinchensoo, то что ты написал просто неправильно,поетому и не работает, счас выложу робочий вариант. Сразу видно что з длл"ками не работал)

Quote (karuy)
Во первых запомни, что вызывать функцыю нужно точно по имени которому она там записана (чуствительность к регистру символов), впринцыпе ето единственная ошыбка которая была, правда пришлось декомпильнуть длл"ку чтоб понять как именно функцыя звется. Держы

Как-то ты себе противоречишь smile
Quote (karuy)
пс еще запомни: такая ошибка возникает когда нет вызываемой функцыи в длл"ке, сюда же относиться регистр символов и к-во параметров.

ну это я и так понимал, просто не думал, что из-за регистра. Не понимал, почему не может найти ее. Даже исходники перелопатил.
Спс еще раз.


ФилДата: Понедельник, 10 Января 2011, 13:17 | Сообщение # 12
Томатный революционер
Сейчас нет на сайте
Vinchensoo, да, в исходниках все нижним регистром написано, где karuy это нашел?
AkyltistДата: Понедельник, 10 Января 2011, 14:10 | Сообщение # 13
заслуженный участник
Сейчас нет на сайте
Накатал утилитку чтобы вытаскивала экспортируемые функции: export.exe 11.5 Kb

использовать в консоли: export 32dll.dll (ну или любая другая dll ка)

Code
IMPORT BinClose, lib:"39dll.dll"
IMPORT BinFileSize, lib:"39dll.dll"
IMPORT BinGetPos, lib:"39dll.dll"
IMPORT BinOpen, lib:"39dll.dll"
IMPORT BinRead, lib:"39dll.dll"
IMPORT BinSetPos, lib:"39dll.dll"
IMPORT BinWrite, lib:"39dll.dll"
IMPORT BufferSize, lib:"39dll.dll"
IMPORT ClearBuffer, lib:"39dll.dll"
IMPORT CreateBuffer, lib:"39dll.dll"
IMPORT DestroyBuffer, lib:"39dll.dll"
IMPORT GetIp, lib:"39dll.dll"
IMPORT GetMACAddress, lib:"39dll.dll"
IMPORT GetPos, lib:"39dll.dll"
IMPORT GetRawOption, lib:"39dll.dll"
IMPORT IpCompare, lib:"39dll.dll"
IMPORT IptoUInt, lib:"39dll.dll"
IMPORT IsSockConnected, lib:"39dll.dll"
IMPORT LastError, lib:"39dll.dll"
IMPORT LastUdpIp, lib:"39dll.dll"
IMPORT LibMain, lib:"39dll.dll"
IMPORT MD5Buffer, lib:"39dll.dll"
IMPORT MD5String, lib:"39dll.dll"
IMPORT MessagePeek, lib:"39dll.dll"
IMPORT MessageRecieve, lib:"39dll.dll"
IMPORT MessageSend, lib:"39dll.dll"
IMPORT MyHost, lib:"39dll.dll"
IMPORT ReadByte, lib:"39dll.dll"
IMPORT ReadDouble, lib:"39dll.dll"
IMPORT ReadFloat, lib:"39dll.dll"
IMPORT ReadInt, lib:"39dll.dll"
IMPORT ReadShort, lib:"39dll.dll"
IMPORT ReadString, lib:"39dll.dll"
IMPORT ReaduInt, lib:"39dll.dll"
IMPORT ReaduShort, lib:"39dll.dll"
IMPORT ResetBuffer, lib:"39dll.dll"
IMPORT SetBuffer, lib:"39dll.dll"
IMPORT SetFormat, lib:"39dll.dll"
IMPORT SetNagleAlgorithm, lib:"39dll.dll"
IMPORT SetPos, lib:"39dll.dll"
IMPORT SetRawOption, lib:"39dll.dll"
IMPORT SockClose, lib:"39dll.dll"
IMPORT SockExit, lib:"39dll.dll"
IMPORT SockStart, lib:"39dll.dll"
IMPORT StreamEncrypt, lib:"39dll.dll"
IMPORT TcpAccept, lib:"39dll.dll"
IMPORT TcpAddress, lib:"39dll.dll"
IMPORT TcpConnect, lib:"39dll.dll"
IMPORT TcpListen, lib:"39dll.dll"
IMPORT UInttoIP, lib:"39dll.dll"
IMPORT UdpConnect, lib:"39dll.dll"
IMPORT WriteByte, lib:"39dll.dll"
IMPORT WriteDouble, lib:"39dll.dll"
IMPORT WriteFloat, lib:"39dll.dll"
IMPORT WriteInt, lib:"39dll.dll"
IMPORT WriteShort, lib:"39dll.dll"
IMPORT WriteString, lib:"39dll.dll"
IMPORT WriteuInt, lib:"39dll.dll"
IMPORT WriteuShort, lib:"39dll.dll"
IMPORT bufferchecksum, lib:"39dll.dll"
IMPORT netconnected, lib:"39dll.dll"
IMPORT setSync, lib:"39dll.dll"

Quote
Займусь тем, что попробую написать код подключения 39dll к дельфи. Там посмотрим.

бери мой список экспорта и его параметры и твоя Либа зашаяет.


Сообщение отредактировал Akyltist - Понедельник, 10 Января 2011, 14:15
VinchensooДата: Понедельник, 10 Января 2011, 14:11 | Сообщение # 14
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Quote (Фил)
Vinchensoo, да, в исходниках все нижним регистром написано, где karuy это нашел?

karuy, по-моему, тоже накосячил. У меня возвращало всегда 290 в его исходнике.
Посмотрел то, что ты кидал, плюс мне помогли со списком функций- правильное название + типы переменных творят чудеса.
Спс Akyltist-у за прогу.
Типы: похоже, что везде используются Pchar и double.
Прога начала выдавать что-то походящее на правду.
Займусь тем, что попробую написать код подключения 39dll к дельфи. Там посмотрим.
Quote (Akyltist)
бери мой список экспорта и его параметры и твоя Либа зашаяет.

он еще и параметры выдает? Вообще класс.
Щас посмотрю, у меня-то был только список функций из чата.
Можно даже написать длл, вызывающую длл.
Рекурсия длл-лок будет biggrin


ФилДата: Понедельник, 10 Января 2011, 14:26 | Сообщение # 15
Томатный революционер
Сейчас нет на сайте
Quote (Vinchensoo)
Займусь тем, что попробую написать код подключения 39dll к дельфи. Там посмотрим.

Как закончишь напишешь решение здесь? :^)
AngevengelistДата: Понедельник, 10 Января 2011, 15:42 | Сообщение # 16
постоянный участник
Сейчас нет на сайте
К моему большому удивлению, 39dll под Delphi работает достаточно шустро.

Добавлено (10.01.2011, 15:42)
---------------------------------------------

Quote (Vinchensoo)
Можно даже написать длл, вызывающую длл.
Рекурсия длл-лок будет

Модуля будет вполне достаточно, я думаю
karuyДата: Понедельник, 10 Января 2011, 15:45 | Сообщение # 17
заслуженный участник
Сейчас нет на сайте
Vinchensoo, ну почему накосячил? smile Просто дизасамблер которым вскрывал длл"ку триал, в итоге параметры не светит, только имена функцый, а изходя из того что 39длл впервые вижу, решыл довериться тебе и не трогать параметры :),хотя догадывался что нужно было стринги ПАнсиЧарами заменить. smile Встречный вопрос: насколько шустро ето чудо, например если з ИНДИ сравнивать?
AngevengelistДата: Понедельник, 10 Января 2011, 16:00 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
Quote (karuy)
Встречный вопрос: насколько шустро ето чудо, например если з ИНДИ сравнивать?

По идеи должно работать все приблизительно одинаково
fragometДата: Понедельник, 10 Января 2011, 16:13 | Сообщение # 19
Ubuntu User
Сейчас нет на сайте
ссори за мега нубской вопрос:
как написать длл бип на дельфи? В нью выбрал длл визард, а дальше?




AngevengelistДата: Понедельник, 10 Января 2011, 16:28 | Сообщение # 20
постоянный участник
Сейчас нет на сайте
Quote (fragomet)
как написать длл бип на дельфи? В нью выбрал длл визард, а дальше?

Пиши код, и компилируй
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг