создание dll под фпц

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение halyavin » 17.11.2007 11:23:50

Sergei I. Gorelkin писал(а):Забавная получается хрень, однако...
Действительно, пока нет stdcall - передает указатель и копирует в вызываемой процедуре. Добавляем stdcall - начинает пихать все в стек на вызывающей стороне. При этом в WinAPI ведь нет ни одной ф-ции, для которой это могло бы быть нужно...

Причем если передается массив или object - то Delphi передает указатель и в случае stdcall...
Запостил как bug #10203.

Fixed in Revision => 9280
halyavin
новенький
 
Сообщения: 25
Зарегистрирован: 23.10.2007 16:35:55

Сообщение Attid » 30.11.2007 15:48:14

"прямые" линки на тест
http://www.freepascal.org/cgi-bin/viewc ... iew=markup

на измененый файл
http://www.freepascal.org/cgi-bin/viewc ... iew=markup

заменил я его, перекомпелировал, собрал пример, ошибок не выдал
длл не грузится =(

скомпелированный ppc386.exe тут http://ifolder.ru/4362418
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение AMD » 12.03.2008 14:55:46

Attid писал(а):"прямые" линки на тест
http://www.freepascal.org/cgi-bin/viewc ... iew=markup

на измененый файл
http://www.freepascal.org/cgi-bin/viewc ... iew=markup

заменил я его, перекомпелировал, собрал пример, ошибок не выдал
длл не грузится =(

скомпелированный ppc386.exe тут http://ifolder.ru/4362418


За долгое время что прошло что чтото удалось?
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Сообщение Attid » 12.03.2008 15:09:10

нет, но если тебе просто длл нужно берешь делаешь и все работает, тут проблемы связи длл на фпц и проги на дельфе.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: создание dll под фпц

Сообщение swa1 » 05.03.2009 23:23:10

Помогите разобраться с dll-кой, никогда раньше не связывался, вот решил и...Что то не так.
В dll-ке функция и процедура. Процедура для проверки работаю с dll-кой или нет. Ф-ии в dll-ке и в проге делают одно и то же. В проге все путем, при вызове из dll получаю
Project raised exception class External SIGSEGV
и потом приезжаю в winapi.inc на function GetCapture: HWND;
Result := WidgetSet.GetCapture;
Может кто подскажет, что не так делаю?
Значит сама dll:
Код: Выделить всё
library dll_test;

{$mode objfpc}{$H+}

uses
  Classes, Forms, Windows, Registry;

{$IFDEF WINDOWS}{$R dll_test.rc}{$ENDIF}

procedure HelloWorld(AForm : TForm);
  begin
    MessageBox(AForm.Handle, ('Hello world!'), pchar ('DLL Message Box'), MB_OK or MB_ICONEXCLAMATION);
  end;

function NameLPTGet :TStrings;
var
Reg: TRegistry;
begin
  result:=TStringList.Create;
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  if Reg.OpenKey('\HARDWARE\DEVICEMAP\PARALLEL PORTS', True) then
  if Reg.ReadString('\Device\Parallel0')<> '' then result.Add('LPT1');
  if Reg.ReadString('\Device\Parallel1')<> '' then result.Add('LPT2');
  if Reg.ReadString('\Device\Parallel2')<> '' then result.Add('LPT3');
  Reg.CloseKey;
  Reg.Destroy;
end;

  exports
    HelloWorld,
    NameLPTGet;

begin
end.


Вот прога которая ее юзает.
Код: Выделить всё
unit dll_demo;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Registry;

procedure HelloWorld(AForm : TForm); stdcall; external 'dll_test.dll';
function NameLPTGet :TStrings; stdcall; external 'dll_test.dll';
type
 
  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    function  GetLptName:TStrings;
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
   HelloWorld(self);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   ComboBox1.Items:= NameLPTGet;
   ComboBox1.ItemIndex:=0;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   ComboBox2.Items:= GetLptName;
   ComboBox2.ItemIndex:=0;
end;

function TForm1.GetLptName:TStrings;
var
Reg: TRegistry;
begin
  result:=TStringList.Create;
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  if Reg.OpenKey('\HARDWARE\DEVICEMAP\PARALLEL PORTS', True) then
  if Reg.ReadString('\Device\Parallel0')<> '' then result.Add('LPT1');
  if Reg.ReadString('\Device\Parallel1')<> '' then result.Add('LPT2');
  if Reg.ReadString('\Device\Parallel2')<> '' then result.Add('LPT3');
  Reg.CloseKey;
  Reg.Destroy;
end;

initialization
  {$I dll_demo.lrs}

end.


С уважением...
Аватара пользователя
swa1
новенький
 
Сообщения: 80
Зарегистрирован: 25.09.2007 11:04:08
Откуда: Ялта

Re: создание dll под фпц

Сообщение v-t-l » 06.03.2009 17:28:38

Наверно WidgetSet не(до)инициирован. :)
Насчет форм в длл-ках уже обсуждалось на форуме.

А вданном конкретном примере зачем передавать TForm, если можно Handle передать.
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: создание dll под фпц

Сообщение swa1 » 07.03.2009 01:02:38

Ну вобще то форма, это так из примера...Визуально вижу, что все работает. Т.е. процедура вызывается и работает. Проблема именно в функции.

хм...WidgetSet... :?:
Если не сложно, можно растолковать...Как я туда попадаю и как мне его
v-t-l писал(а):(до)инициировать
Аватара пользователя
swa1
новенький
 
Сообщения: 80
Зарегистрирован: 25.09.2007 11:04:08
Откуда: Ялта

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru