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

Тема в разделе "Delphi - Система", создана пользователем Guest_Danemon, 27 июн 2004.

Статус темы:
Закрыта.
  1. Guest_Danemon

    Guest_Danemon Гость

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

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

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    Guest_Danemon
    код в студию плиз
     
  3. Guest

    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, а если запустить программу из проводника - вообще ничего не происходит. При обращении к библиотеки программа просто закрывается, и ничего не отображает, сразу так жестоко и глючно.
     
  4. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    Guest
    попробуй вручную поуправлять через функции Loadlibrary и freelibrary. Посмотрим что получится.
    Просто щас ночь и я глануть смогу через пару дней, т.к. делфей нету пока.
     
  5. RAIN

    RAIN Гость

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

    Guest Гость

    Это я уже использовал. Насколько я помню, name пишут если вызываемая функция не совпадает по названию с функцией в библиотеке.

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

    Barmutik Гость

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

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

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

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

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

    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
    ---------------------------
     
  9. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    Код (Text):
    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.
    пробуй
     
  10. Guest_Danemon

    Guest_Danemon Гость

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

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

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

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

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    Guest_Danemon
    stdcall - просто указывает на callback функция насколько я помню. но если билиоеку используешь только для своих целей в Delphi - то это не обязательно использовать.

    string - это троковый тип, а PCHar - это указатель на строку, насколько я понимаю.
    т.е. приравнять ты их не сможешь. юзай в зависимости от ситуации. но для использования в DElphi string хватет.
     
  12. Danemon

    Danemon Гость

    Спасибо!
     
  13. Barmutik

    Barmutik Гость

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

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

    Данная директива регламетрирует кто вызывающая или вызываемая функция занимается очисткой стека после вызова процедуры.
     
Загрузка...
Похожие Темы - Написание пользовательских библиотек
  1. wellsun
    Ответов:
    0
    Просмотров:
    131
  2. vladis222
    Ответов:
    1
    Просмотров:
    627
  3. smailvolf
    Ответов:
    1
    Просмотров:
    1.039
  4. faissullin
    Ответов:
    0
    Просмотров:
    1.091
  5. IseLL
    Ответов:
    1
    Просмотров:
    998
Статус темы:
Закрыта.

Поделиться этой страницей