GeoGet

Complete geocaching solutions

User Tools

Site Tools


user:skripty:dlls

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
user:skripty:dlls [2016/09/08 07:49] – [Vytvoření DLL knihovny pro použití v GeoGetu] gorduser:skripty:dlls [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 145: Line 145:
 Pokud takto změníte volací konvenci a knihovnu použijete také ve své vlastní aplikaci vytvořené v C/C++, je na to třeba pamatovat a knihovní funkce použít správně. Pokud takto změníte volací konvenci a knihovnu použijete také ve své vlastní aplikaci vytvořené v C/C++, je na to třeba pamatovat a knihovní funkce použít správně.
  
 +
 +
 +===== Přebírání parametru typu string z DLL knihovny =====
 +
 +<WRAP important>U návratových hodnot typu ''string'' (''ansistring'') je problém s uvolněním paměti při ukončení pluginu. Zřejmě se nějak pere správa paměti v Geogetu a ve scriptengine. Vhodné řešení spočívá v úpravě knihovních funkcí a jejich volání tak, aby ve skutečnosti nebyl vracen typ ''string'', ale nejaký ordinarní typ proměnné.</WRAP>
 +
 +  * knihovní funkce má navíc 2 parametry: adresu textového bufferu a jeho alokovanou velikost
 +  * místo aby funkce vracela string, zápíše string do bufferu a vrátí počet zapsaných znaků
 +
 +Takže s ohledem na výše řečené bude plugin obsahovat něco takovéhoto:
 +
 +<code delphi>
 +//deklarace knihovní funkce
 +function SoucetStr(s1,s2,sBuffer: PChar; iMaxLen:integer): integer; external 'SoucetStr@MojeKnihovna.dll stdcall delayload';
 +...
 +
 +//volání a převzetí vráceného textu
 +const MAX_BUFR_LENGTH=256;
 +
 +var sBuffer:ansistring; // !! pokud pouzijete string misto ansistring, 
 +                        // !! bude na konci sBuffer obsahovat prazdny text, 
 +                        // !! protoze 1. byt znaku bude mit hodnotu 0
 +                        // !! a to bude chapano jako konec textu 
 +    iLen:integer;
 +begin
 +  ...
 +  SetLength(sBuffer,MAX_BUFR_LENGTH);
 +  iLen:=SoucetStr('12345','abcde',sBuffer,MAX_BUFR_LENGTH);
 +  SetLength(sBuffer,iLen);
 +  ...
 +end;
 +</code>
 +
 +a funkce v DLL knihovně může vypadat třeba nějak takto:
 +
 +<code C++>
 +LIB_EXPORT int SoucetStr(LPCSTR s1, LPCSTR s2, LPSTR sBuffer, int iMaxLen){
 +  CString cs=CString(s1)+CString(s2);
 +  strcpy_s(sBuffer,iMaxLen,cs);
 +  return(strlen(sBuffer));
 +}
 +</code>
user/skripty/dlls.1473313770.txt.gz · Last modified: 2016/09/08 00:00 (external edit)