Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2011, 17:13   #11
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

В библиотеке функция, возвращающая PChar 'Hello, world!'.
Попробовал из официального мана:
Код:
uses dynlibs;
 
var
  MyLibC: TLibHandle;
  MyProc: TMyProc;
begin
  MyLibC := LoadLibrary('libc.' + SharedSuffix);
  if MyLibC = 0 then Exit;
  MyProc := TMyProc(GetProcedureAddress(MyLibC, 'getpt');
  if MyProc = nil then Exit;
end;
Так всё собралось без ошибок но, на Caption Button'а, возвращается буква 'U', и ничего я с этим сделать не могу.
Видать там действительно проблемы со смещением адреса функции.
К сожалению без Вашего полного кода я уже ничего сделать не смогу
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook

Последний раз редактировалось xwicked; 05.07.2011 в 23:17.
xwicked вне форума Ответить с цитированием
Старый 06.07.2011, 15:07   #12
Diez_
Пользователь
 
Регистрация: 10.06.2011
Сообщений: 27
По умолчанию

{$mode DELPHI}
в начаале программы исправить ошибку которую лазарь выдает на строке
Цитата:
@GetSimpleText := GetProcAddress(LibHandle,'GetSimple Text');
просто работа указателей в fpc и delphi несколько различаются
Мозг! Вернись!
Diez_ вне форума Ответить с цитированием
Старый 06.07.2011, 15:39   #13
Diez_
Пользователь
 
Регистрация: 10.06.2011
Сообщений: 27
По умолчанию

полный код к сожалению предоставить не смогу, а вод аналог того как реализована либа и способ её подключения пожалуйста)
либа
Код:
library lib;

{$mode objfpc}{$H+}

uses
  Classes
  { you can add units after this };

{$R *.res}

function _text () : PChar; stdcall; export;
begin
  _text := 'Hello word!';
end;

exports
 _text;

begin
end.
способ подключения
Код:
unit Unit1; 

{$mode delphi}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Dynlibs;

type

  { TForm1 }

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

var
  Form1: TForm1; 

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  libFile : THandle;
  text : function () : PChar; stdcall;
begin
  libFile := LoadLibrary(ExtractFilePath(Application.ExeName) + 'lib.so');
  if libFile >= 32 then
  begin
   text := nil;
   @text := GetProcAddress(libFile,'_text');
   if @text <> nil then
   begin
     Edit1.Text := text();
   end
   else exit;
   FreeLibrary(libFile);
  end
  else exit;
end;

end.
при нажатии на кнопку, если FreeLibrary(libFile); не используется то всё работает нормально, в ином случае прога просто заерывается(
Мозг! Вернись!
Diez_ вне форума Ответить с цитированием
Старый 06.07.2011, 21:07   #14
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Diez_ Посмотреть сообщение
... при нажатии на кнопку, если FreeLibrary(libFile); не используется то всё работает нормально, в ином случае прога просто заерывается(
Если и в этом простом примере такая же ситуация повторяется, то OK я проверю.
А про режим компилятора я походу запамятовал .
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 07.07.2011, 00:05   #15
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка Продолжаем обзор :)

lazarus версии 0.90.30(Windows XPSP3).

Я модифицировал Ваш код. Вот, что получилось:
Код:
library project1;

{$mode objfpc}{$H+}

uses
  Classes;

{$R *.res}
function _text () : PChar; stdcall; export;
begin
  Result := 'Hello word!';//Написал Result, вместо _text
end;

exports
 _text;
begin
end.
Код:
unit Unit1; 

{$mode delphi}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  dynlibs;

type

  { TForm1 }

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

type TTextLib = function () : PChar;//Создал тип

var
  Form1: TForm1;
//Вынес переменные из функции
  libFile : TLibHandle;//Изменил на TLibHandle
  text :  TTextLib;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
//Добавил промежуточную переменную(во избежании ошибок)
var s: PChar;
begin
//Убрал несколько проверок
  libFile := LoadLibrary('project1.dll');
  if libFile <> 0 then
  begin
//Добавил преобразование к новому типу
//Изменил на "GetProcedureAddress"
   text := TTextLib(GetProcedureAddress(libFile,'_text'));
   s := PChar(text);
   Button1.Caption := StrPas(s);//Преобразование PChar в String
//На Caption отобразилось "Hello word!" ЧТД
   FreeLibrary(libFile);//Произошла выгрузка отлично!!! :)
  end
  else exit;
end;

end.
Это железно работает в винде.
Ваш код, в том виде, в каком Вы предоставили его, опять не заработал(даже не скомпилился). Ошибки теже .

Сообщите, пожалуйста, как заработает мой код в Вашем Линуксе и название Вашего дистрибутива Линукса. Поставлю его и уже буду эксперементировать на Вашей платформе
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook

Последний раз редактировалось xwicked; 07.07.2011 в 00:07.
xwicked вне форума Ответить с цитированием
Старый 07.07.2011, 11:51   #16
Diez_
Пользователь
 
Регистрация: 10.06.2011
Сообщений: 27
По умолчанию

пробывал сделать по аналогии вашего кода, та же ошибка что и была
дистриб : Linux Ubuntu 10.04.2 LTS

может я че делаю не правильно.
Мозг! Вернись!
Diez_ вне форума Ответить с цитированием
Старый 07.07.2011, 15:58   #17
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Diez_ Посмотреть сообщение
пробывал сделать по аналогии вашего кода, та же ошибка что и была
дистриб : Linux Ubuntu 10.04.2 LTS

может я че делаю не правильно.
Пока я проверяю Ваш линукс, скажите мне, пожалуйста, нельзя ли статически компоновать? Большой ли у Вас проект? А то будет ерунда. Я проверю - заработает - Вы опять будете говорить, что у Вас не работает. Попытайтесь хотя бы самому себе помочь, для начала!

Как Вы специфически настраивали компилятор, свойства проекта, что нестандартное использовали? Может какие-нибудь левые дополнительные компоненты?
Если это пентагонова прога - то увы - мало информации, для решения Вашей ошибки!

ЗЫ: Если на моей тестовой машине это повторится, то меняйте дистрибутив или компилятор
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook

Последний раз редактировалось xwicked; 07.07.2011 в 16:16.
xwicked вне форума Ответить с цитированием
Старый 07.07.2011, 20:01   #18
Diez_
Пользователь
 
Регистрация: 10.06.2011
Сообщений: 27
По умолчанию

нет, я не подключал ничего левого, насчет проекта, в нем так же потом будут подключаться либы, которые будут дописоваться и хотелось бы на этом этапе понять как исправить эту ошибку, насчет статистического подключения, просто не хочется держать в памяти то, что используется только при старте программы
Мозг! Вернись!
Diez_ вне форума Ответить с цитированием
Старый 07.07.2011, 21:19   #19
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Diez_ Посмотреть сообщение
нет, я не подключал ничего левого, насчет проекта, в нем так же потом будут подключаться либы, которые будут дописоваться и хотелось бы на этом этапе понять как исправить эту ошибку, насчет статистического подключения, просто не хочется держать в памяти то, что используется только при старте программы
Ещё раз Lazarus меня расстраивает - всё как у Вас, даже по шагам отладчик пройти не может Один вариант OnDestroy и всё. В этой ссылке написано, про другую Вашу ошибку, которая возникает в винде, но есть видать и отголоски в линухе

ЗЫ: Пару дней ещё покопаюсь в поиске - если что-нить найду, отпишусь...
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 07.07.2011, 21:23   #20
Diez_
Пользователь
 
Регистрация: 10.06.2011
Сообщений: 27
По умолчанию

спасибо за помощь )

з.ы. в винде как ни странно у меня тоже все заработало
в Линуксе же, та же ошибка
делал по аналогии Вашего кода
Мозг! Вернись!

Последний раз редактировалось Diez_; 07.07.2011 в 21:36.
Diez_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие html-файлов в Lazarus student2008 Lazarus, Free Pascal, CodeTyphon 2 25.12.2010 11:07
Подключение DLL Ninetta Общие вопросы .NET 3 01.04.2010 01:06
Подключение DLL __Demon__ C++ Builder 2 09.12.2009 00:29
подключение coredll.dll BattleMage Win Api 1 21.09.2009 14:19
Подключение DLL 5naip Помощь студентам 9 27.10.2007 20:55