Lazrus - externí dll – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Lazrus - externí dll – Pascal – Fórum – Programujte.comLazrus - externí dll – Pascal – Fórum – Programujte.com

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Pergoly a střechy Brno

lazar
~ Anonymní uživatel
2 příspěvky
4. 1. 2022   #1
-
0
-

Zdravím, potřeboval bych poradit.

V Lazarusu zkouším udělat externí dll:

LIBRARY dll;

{$mode objfpc}{$H+}

USES
  CLASSES,windows
  { you can add units after this };

function txt: String; stdcall;

BEGIN
  txt:= 'pokus dll';
END;

exports
txt;

END.

Aplikace 

UNIT UNIT1;

{$mode objfpc}{$H+}

INTERFACE

USES
  CLASSES, SYSUTILS, FORMS, CONTROLS, GRAPHICS, DIALOGS, StdCtrls, DynLibs, FileUtil;

TYPE

  { TFORM1 }

  TFORM1 = CLASS(TFORM)
    LABEL1: TLABEL;
    PROCEDURE FORMCREATE(SENDER: TOBJECT);
    PROCEDURE FORMSHOW(SENDER: TOBJECT);
  PRIVATE

  PUBLIC

  END;

VAR
  FORM1: TFORM1;
  pks: String;

IMPLEMENTATION

type
  TMyDLL = function(): String; stdcall;

{$R *.lfm}

{ TFORM1 }

PROCEDURE TFORM1.FORMCREATE(SENDER: TOBJECT);
VAR LIB: TLibHandle;
    DllFunc: TMyDll;
begin
    LIB:= SafeLoadLibrary('dll.dll');
  IF (LIB<>0) THEN
  begin
   DllFunc:= TMyDll(GetProcedureAddress(LIB,'txt'));
   IF Assigned(DllFunc) THEN
   begin
    pks:= DllFunc();
   end;
  end;
  FreeLibrary(LIB);
  //UnloadLibrary(LIB);
end;
END;

PROCEDURE TFORM1.FORMSHOW(SENDER: TOBJECT);
BEGIN
  Label1.Caption:= pks;
END;

END.

Dojede to v pohodě až k Label1.Caption:= pks; pak to vyhodí chybu:

Projekt aplikace vyvolal vyjímku třídy 'External: SIGSEGV'. na adrese 100008D9A

Assembler:

0000000100008D9A 48837b0800               cmpq   $0x0,0x8(%rbx)

A i když poté zkusím např. Label1.Caption:= 'nějaký text'; tak to vždy vypíše stejnou chybu.

Když odmažu pks:=DllFunc(); a nechám Label1.Caption:= 'nějaký text';, tak už to chyba nevyskočí, ale samozřejmě to taky nic nenačte z dll. Nevíte prosím někdo, kde by mohla být chyba?

Díky

Nahlásit jako SPAM
IP: 62.168.38.–
gna
~ Anonymní uživatel
1643 příspěvků
4. 1. 2022   #2
-
0
-

Ono by mohlo stačit tu dllku neunloadnout, nebo vytvořit kopii toho stringu.

orig := DllFunc();
copy := Copy(orig, 1, Length(orig));
orig := '';

Ale ruku do ohně za to nedám. Nejjistější bude stringy z programu a dllky nemíchat. Třeba předávej proceduře v dllce buffer k naplnění.

procedure GetString(buf: pchar; var bufsize: integer); stdcall;
...
Nahlásit jako SPAM
IP: 213.211.51.–
lazar
~ Anonymní uživatel
2 příspěvky
6. 1. 2022   #3
-
+1
-
Zajímavé

Tak vyřešeno. Kdyby to někoho zajímalo, tak:

dll :

LIBRARY dll;

{$mode objfpc}{$H+}

USES
  CLASSES,windows
  { you can add units after this };

function txt:PChar; stdcall;
BEGIN
  result:= PChar('pokus dll');
END;

exports
GetString;

END.

apklikace:

změnit TMyDLL = function(): String; stdcall;

na 

TMyDLL = function(): PChar; stdcall;

Takže stačilo jen změnit datový typ. Děkuji uživateli gna za inspiraci.

Nahlásit jako SPAM
IP: 62.168.38.–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 29 hostů

Podobná vlákna

Import dll do me dll — založil VladislavK

Externí RAM — založil yaqwsx

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032022 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý