Anonymní profil lazar – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil lazar – Programujte.comAnonymní profil lazar – Programujte.com

 

Příspěvky odeslané z IP adresy 62.168.38.–

lazar
Pascal › Lazrus - externí dll
6. 1. 2022   #389514

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.

lazar
Pascal › Lazrus - externí dll
4. 1. 2022   #389500

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

 

 

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