• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Написание пользовательских библиотек

  • Автор темы Guest_Danemon
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest_Danemon

Было время, когда все процедуры писАл в главной программе. Но вот настало время освоить DLL-ки. Параметры библиотека воспринимает нормально, обрабатывает тоже нормально, но возвращать результат не желает.

Если модуль Sharemem прописать как положено - результат уже возвращает, да только приложение выдает ошибку всегда при закрытии. :(
 
G

Guest

Текст в головной программе

В одном месте пишу такое:
edit2.Text:=floattostr(convert_num(a,2));
где convert_num - название функции из библиотеки

Далее сам вызов библиотеки:
function convert_num(num: longint; Osn: byte): word;
external 'cnv.dll';

---------------------
Текст кода библиотеки
library Cnv;
uses Sharemem, SysUtils;

function convert_num(num: longint; Osn: byte): word; stdcall; export;
begin
k:=0;
result:=strtoint(inttostr(k));
end;

exports convert_num;
end.


В библиотеке уже подключен модуль Sharemem, равно как и в головной программе (прописан первым в первой строке uses). Так вот, как я говорил, результат возвращается, а вот при закрытии программы выскакивает сообщение
---------------------------
Debugger Fault Notification
---------------------------
Project G:\Games\Íîâàÿ ïàïêà\Project1.exe faulted with message: 'access violation at 0x00c06d39: write of address 0x01806d0c'. Process Stopped. Use Step or Run to continue.
---------------------------
OK
---------------------------

Еще фокус-покус: это сообщение появляется только из среды Delphi, а если запустить программу из проводника - вообще ничего не происходит. При обращении к библиотеки программа просто закрывается, и ничего не отображает, сразу так жестоко и глючно.
 
A

admin

Guest
попробуй вручную поуправлять через функции Loadlibrary и freelibrary. Посмотрим что получится.
Просто щас ночь и я глануть смогу через пару дней, т.к. делфей нету пока.
 
R

RAIN

Далее сам вызов библиотеки:
function convert_num(num: longint; Osn: byte): word;
external 'cnv.dll';
Может ты ее не правильно подключил? Я с библиотеками не работал, но попробуй написать так:
Код:
function convert_num(num: longint; Osn: byte): word; stdcall;
external 'cnv.dll' name 'convert_num';
 
G

Guest

function convert_num(num: longint; Osn: byte): word; stdcall;
external 'cnv.dll' name 'convert_num';
Это я уже использовал. Насколько я помню, name пишут если вызываемая функция не совпадает по названию с функцией в библиотеке.

Короче - пробовал, и не работает все так же успешно.
 
B

Barmutik

Попробовал я твой код.. всё чудно с первого раза скомпилялось и заработало.. НИ одной НИкакой ошибки...

Возник вопрос: зачем тебе ShareMem ? В функции ты не используеш строковых параметров ...

И ещё так одно к слову .. я понимаю что функция тестовая .. но вопрос какого типа 'К' ?

Если она не Word то конечно будет полёт по памяти при возврате из процедуры... поставь RangeChecking и сам увидиш .. может в этом и есть проблема...

Приведи полный текст .. может станет более понятно ...
 
G

Guest_Danemon

Что-то посмотрю, форум меня постоянно Гостем обзывает. Ну, да ладно. Я всегда против регистрации был, и особенно политики, как на форуме iXBT.com.
Проехали...
--------------------------------------------------------------
В попыхах забыл указать, К и в самом деле Word-типа.

На счет полного кода, то он таков.

---------------------Головная-------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function convert_num(a:longint;Osn:byte):word;
external 'cnv.dll';

procedure TForm1.Button1Click(Sender: TObject);
var a: longint;
begin
a:=37;
Form1.Caption:=floattostr(convert_num(a,3));
end;

end.


------------------библиотека------------------------
library Cnv;
uses
SysUtils;

function convert_num(num: longint; Osn: byte): word;stdcall;export;
var k: word;
begin
k:=0;
result:=strtoint(inttostr(k));
end;

exports convert_num;
end.

Тут Sharemem что есть, что нет - одинаково возникает сообщение
---------------------------
Debugger Fault Notification
---------------------------
Project G:\Games\Íîâàÿ ïàïêà\Project1.exe faulted with message: 'access violation at 0x01006629: write of address 0x01c065fc'. Process Stopped. Use Step or Run to continue.
---------------------------
OK
---------------------------
 
A

admin

Код:
library cnv;
uses
SysUtils;

function convert_num(num: longint; Osn: byte): word;
var k: word;
begin
k:=0;
result:=strtoint(inttostr(k));
end;

exports convert_num;
end.

пробуй
 
G

Guest_Danemon

Спасибо! Работает все как положено (и написано ::).

Вот только у меня вопрос возник, почему такой полезный штук , который Delphi Help называется, посоветовал всегда и везде использовать stdcall; export;

Причем, другие люди тоже говорили это.

Ладно.
Последний (надеюсь) вопрос: что лучше использовать String или PChar в том же обмене данными с библиотекой? Или есть еще что-то, кроме этих типов?
 
A

admin

Guest_Danemon
stdcall - просто указывает на callback функция насколько я помню. но если билиоеку используешь только для своих целей в Delphi - то это не обязательно использовать.

Последний (надеюсь) вопрос: что лучше использовать String или PChar в том же обмене данными с библиотекой? Или есть еще что-то, кроме этих типов?
string - это троковый тип, а PCHar - это указатель на строку, насколько я понимаю.
т.е. приравнять ты их не сможешь. юзай в зависимости от ситуации. но для использования в DElphi string хватет.
 
B

Barmutik

stdcall - указывает на мехнизм управления очисткой параметров.. в Дельфи по умолчанию stdcall

В Visual по умолчанию - cdecl..

Данная директива регламетрирует кто вызывающая или вызываемая функция занимается очисткой стека после вызова процедуры.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!