GeoGet

Complete geocaching solutions

User Tools

Site Tools


user:skripty:dlls

This is an old revision of the document!


Volání funkcí v DLL knihovnách

Ze skriptů GeoGetu lze volat funkce v externích DLL knihovnách.

Ve skriptu lze nadeklarovat svojí funkci či proceduru, jejíž implementace není ve skriptu, ale v externí DLL knihovně. Externí DLL knihovnu lze připravit v libovolném programovacím jazyce, který umí překládat do standardní DLL knihovny.

Pokud chcete deklarovat funkci uloženou v DLL knihovně, napište za hlavičku funkce klíčová slovo external a za něj řetězec ve formátu: 'functionname@dllname callingconvention'

Překladač pak nebude hledat ve skriptu implementaci funkce a v případě potřeby zavolá příslušnou funkci v DLL knihovně.

Všimněte si v příkladech při deklaraci funkcí z knihovny klíčového slova delayload na konci deklarace každé knihovní funkce. Není sice nutné, ale pokud nebude uvedeno a dojde k nějaké chybě, GeoGet pravděpodobně ošklivě zhavaruje hned při spouštění pluginu. Pokud klíčové slovo uvedete, plugin bude pracovat až narazí na příslušnou funkci, tam napíše, že nelze funkci spustit (neuvede však jakou funkci, ale uvede kde) a relativně korektně se ukončí.

Příklad:

function FindWindow(C1, C2: PChar): Longint; external 'FindWindowA@user32.dll stdcall delayload';
function ShowWindow(hWnd, nCmdShow: Longint): Integer; external 'ShowWindow@user32.dll stdcall delayload';
function SetWindowText(hWnd: Longint; Text: PChar): Longint; external 'SetWindowTextA@user32.dll stdcall delayload';
 
procedure something;
var
  i: longint;
  wnd: longint;
begin
  wnd := Findwindow('', 'Innerfuse Pascal Script III');
  SetWindowText(Wnd, 'This is DLL demo, it calls some windows user32 routines. This will hide this window for a few seconds');
  for i := 0 to 200000 do begin end;
  ShowWindow(Wnd, 0); // hide it
  for i := 0 to 200000 do begin end;
  SetWindowText(Wnd, 'Wasn''t that nice?');
  ShowWindow(Wnd, 5); // show it
  for i := 0 to 200000 do begin end;
  SetWindowText(Wnd, 'Innerfuse Pascal Script III');
end;

Vyzkoušené deklarace Windowsích funkcí z knihoven

function GetShortPathName(lpszLongPath, lpszShortPath: PChar; cchBuffer: integer): integer; external 'GetShortPathNameA@Kernel32.dll stdcall delayload';
function GetShortPathNameLength(lpszLongPath: PChar; lpszShortPath, cchBuffer: integer): integer; external 'GetShortPathNameA@Kernel32.dll stdcall delayload';
 
function GetShortName(value: string): string;
var
  l: integer;
begin
  l := GetShortPathNameLength(value,0,0);
  SetLength(Result, l);
  l := GetShortPathName(value, Result, Length(Result));
  SetLength(Result, l);
end;

Vytvoření DLL knihovny pro použití v GeoGetu

Vytvoření knihovny v Delphi asi nebude dělat velké problémy, ale pro knihovnu vytvářenou v C++ je třeba si uvědomit odlišnosti mezi Delphi a C++. Jde zejména:

  • o konvenci volání funkcí
  • o dekorování jmen funkcí.

Konvence volání funkcí

Dekorování jmen funkcí

user/skripty/dlls.1473171015.txt.gz · Last modified: 2016/09/06 00:00 (external edit)