Добрый день. Нужен код для консольного приложения на дельфи. Нужно объявить функцию из dll, чтобы можно было ее использовать далее в программе. В коде нужно показать, как вообще объявляется и интегрируется dll, как исп. ее функции. Кто поможет- + в репу
Angevengelist, подразумевается, что процедура LaLaLa так и называется в dll? BOOM, еще читаю статьи Акулова, вещь жесткая, много чего есть, но не все понятно. Там на программиста высокого уровня все-таки Программа Delphi World Lorderon, ок,спс, ознакомлюсь. Хотя способ Angevengelist понравился, завтра проверю
Итак, попробовал предложенные способы, возникла следующая трабла:
Код проекта:
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 пробовал, таже проблема. Варианты, как поправить?
Vinchensoo, интересная тема, сам ей интересуюсь :^) Вот нарыл кое-что в интернете:
Code
unit dll39;
interface
//buffer write function WriteByte(data:double):double; cdecl; external '39dll.dll'; function WriteString(data:pchar;writesize:double):double; cdecl; external '39dll.dll'; function WriteShort(data:double):double; cdecl; external '39dll.dll'; function WriteInt(data:double):double; cdecl; external '39dll.dll'; function WriteFloat(data:double):double; cdecl; external '39dll.dll'; function WriteDouble(data:double):double; cdecl; external '39dll.dll';
//buffer read function ReadByte():double; cdecl; external '39dll.dll'; function ReadString(size:double;separator:pchar):pchar; cdecl; external '39dll.dll'; function ReadShort():double; cdecl; external '39dll.dll'; function ReadInt():double; cdecl; external '39dll.dll'; function ReadFloat():double; cdecl; external '39dll.dll'; function ReadDouble():double; cdecl; external '39dll.dll';
//buffer other function ClearBuffer():double; cdecl; external '39dll.dll'; function SetPos(pos:double):double; cdecl; external '39dll.dll'; function GetPos(pos:double):double; cdecl; external '39dll.dll'; function BufferSize():double; cdecl; external '39dll.dll'; function CreateBuffer():double; cdecl; external '39dll.dll';
implementation
end.
Ошибок во всяком случае не вызывает
upd Вот все команды и исходник
Code
unit dll39;
// 39DLL LIB UNIT FOR DELPHI CREATED BY // PIETER6 // Enjoy <img src="http://s12.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile">
interface
function dllInit():double; cdecl; external '39dll.dll';
function writebyte(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function writestring(arg1:pchar; arg2: double):double; cdecl; external '39dll.dll'; function writeshort(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function writeint(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function writefloat(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function writedouble(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function readbyte(arg1: double):double; cdecl; external '39dll.dll'; function readstring(arg1: double):pchar; cdecl; external '39dll.dll'; function readshort(arg1: double):double; cdecl; external '39dll.dll'; function readint(arg1: double):double; cdecl; external '39dll.dll'; function readfloat(arg1: double):double; cdecl; external '39dll.dll'; function readdouble(arg1: double):double; cdecl; external '39dll.dll'; function clearbuffer(arg1: double):double; cdecl; external '39dll.dll'; function setpos(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function getpos(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function buffsize(arg1: double):double; cdecl; external '39dll.dll'; function writechars(arg1:pchar; arg2: double):double; cdecl; external '39dll.dll'; function readchars(arg1: double; arg2: double):pchar; cdecl; external '39dll.dll'; function createbuffer():double; cdecl; external '39dll.dll'; function freebuffer(arg1: double):double; cdecl; external '39dll.dll'; function writeushort(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function writeuint(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function readushort(arg1: double):double; cdecl; external '39dll.dll'; function readuint(arg1: double):double; cdecl; external '39dll.dll'; function copybuffer(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function copybuffer2(arg1: double; arg2: double; arg3: double; arg4: double):double; cdecl; external '39dll.dll'; function bytesleft(arg1: double):double; cdecl; external '39dll.dll'; function bufferexists(arg1: double):double; cdecl; external '39dll.dll'; function readsep(arg1:pchar; arg2: double):pchar; cdecl; external '39dll.dll';
//sockets function tcpconnect(arg1:pchar; arg2: double; arg3: double):double; cdecl; external '39dll.dll'; function tcplisten(arg1: double; arg2: double; arg3: double):double; cdecl; external '39dll.dll'; function tcpaccept(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function sendmessage(arg1: double; arg2:pchar; arg3: double; arg4: double):double; cdecl; external '39dll.dll'; function receivemessage(arg1: double; arg2: double; arg3: double):double; cdecl; external '39dll.dll'; function setsync(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function setformat(arg1: double; arg2: double; arg3:pchar):double; cdecl; external '39dll.dll'; function udpconnect(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function hostip(arg1:pchar):pchar; cdecl; external '39dll.dll'; function lastinIP():pchar; cdecl; external '39dll.dll'; function closesock(arg1: double):double; cdecl; external '39dll.dll'; function tcpip(arg1: double):pchar; cdecl; external '39dll.dll'; function socklasterror():double; cdecl; external '39dll.dll'; function myhost():pchar; cdecl; external '39dll.dll'; function compareip(arg1:pchar; arg2:pchar):double; cdecl; external '39dll.dll'; function sockexit():double; cdecl; external '39dll.dll'; function sockstart():double; cdecl; external '39dll.dll'; function getmacaddress():pchar; cdecl; external '39dll.dll'; function peekmessage(arg1: double; arg2: double; arg3: double):double; cdecl; external '39dll.dll'; function setnagle(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function tcpconnected(arg1: double):double; cdecl; external '39dll.dll'; function getsocketid(arg1: double):double; cdecl; external '39dll.dll'; function lastinPort():double; cdecl; external '39dll.dll';
function fileopen(arg1:pchar; arg2: double):double; cdecl; external '39dll.dll'; function fileclose(arg1: double):double; cdecl; external '39dll.dll'; function filewrite(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function fileread(arg1: double; arg2: double; arg3: double):double; cdecl; external '39dll.dll'; function filepos(arg1: double):double; cdecl; external '39dll.dll'; function filesetpos(arg1: double; arg2: double):double; cdecl; external '39dll.dll'; function filesize(arg1: double):double; cdecl; external '39dll.dll';
function md5string(arg1:pchar):pchar; cdecl; external '39dll.dll'; function md5buffer(arg1: double):pchar; cdecl; external '39dll.dll'; function adler32(arg1: double):double; cdecl; external '39dll.dll'; function bufferencrypt(arg1:pchar; arg2: double):double; cdecl; external '39dll.dll'; //function bufferdecrypt(arg1:pchar; arg2: double):double; cdecl; external '39dll.dll'; function iptouint(arg1:pchar):double; cdecl; external '39dll.dll'; function uinttoip(arg1: double):pchar; cdecl; external '39dll.dll'; function netconnected():double; cdecl; external '39dll.dll';
function bool(arg0:double):boolean; implementation
function bool(arg0:double):boolean; begin if arg0 > 0 then result := true else result := false; end;
Vinchensoo, то что ты написал просто неправильно,поетому и не работает, счас выложу робочий вариант. Сразу видно что з длл"ками не работал)
Добавлено (10.01.2011, 12:27) --------------------------------------------- Во первых запомни, что вызывать функцыю нужно точно по имени которому она там записана (чуствительность к регистру символов), впринцыпе ето единственная ошыбка которая была, правда пришлось декомпильнуть длл"ку чтоб понять как именно функцыя звется. Держы --------------------------------------------- пс еще запомни: такая ошибка возникает когда нет вызываемой функцыи в длл"ке, сюда же относиться регистр символов и к-во параметров.
Сообщение отредактировал karuy - Понедельник, 10 Января 2011, 12:29
karuy, а как мы узнаем точные регистры остальных функций? Может вы по доброте душевной выложите их здесь? :D
Вот как хз, я даже исходники смотрел и проглядел регистр этот. Самое интересное, в гмл она вызывается спокойно, когда вводишь все маленькими буквами.
Quote (karuy)
Vinchensoo, то что ты написал просто неправильно,поетому и не работает, счас выложу робочий вариант. Сразу видно что з длл"ками не работал)
Quote (karuy)
Во первых запомни, что вызывать функцыю нужно точно по имени которому она там записана (чуствительность к регистру символов), впринцыпе ето единственная ошыбка которая была, правда пришлось декомпильнуть длл"ку чтоб понять как именно функцыя звется. Держы
Как-то ты себе противоречишь
Quote (karuy)
пс еще запомни: такая ошибка возникает когда нет вызываемой функцыи в длл"ке, сюда же относиться регистр символов и к-во параметров.
ну это я и так понимал, просто не думал, что из-за регистра. Не понимал, почему не может найти ее. Даже исходники перелопатил. Спс еще раз.
Vinchensoo, да, в исходниках все нижним регистром написано, где karuy это нашел?
karuy, по-моему, тоже накосячил. У меня возвращало всегда 290 в его исходнике. Посмотрел то, что ты кидал, плюс мне помогли со списком функций- правильное название + типы переменных творят чудеса. Спс Akyltist-у за прогу. Типы: похоже, что везде используются Pchar и double. Прога начала выдавать что-то походящее на правду. Займусь тем, что попробую написать код подключения 39dll к дельфи. Там посмотрим.
Quote (Akyltist)
бери мой список экспорта и его параметры и твоя Либа зашаяет.
он еще и параметры выдает? Вообще класс. Щас посмотрю, у меня-то был только список функций из чата. Можно даже написать длл, вызывающую длл. Рекурсия длл-лок будет
Vinchensoo, ну почему накосячил? Просто дизасамблер которым вскрывал длл"ку триал, в итоге параметры не светит, только имена функцый, а изходя из того что 39длл впервые вижу, решыл довериться тебе и не трогать параметры :),хотя догадывался что нужно было стринги ПАнсиЧарами заменить. Встречный вопрос: насколько шустро ето чудо, например если з ИНДИ сравнивать?