user:skripty:dlls
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
user:skripty:dlls [2016/09/07 08:53] – [Vytvoření DLL knihovny pro použití v GeoGetu] gord | user:skripty:dlls [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
Line 66: | Line 66: | ||
- v adresáři, který je uveden v systémové proměnné PATH (samozřejmě je možné tuto proměnnou upravit) | - v adresáři, který je uveden v systémové proměnné PATH (samozřejmě je možné tuto proměnnou upravit) | ||
- v adresáři, kde je exe soubor, který knihovnu používá (v našem případě GeoGet.exe) | - v adresáři, kde je exe soubor, který knihovnu používá (v našem případě GeoGet.exe) | ||
+ | - v aktualním (pracovním) adresáři, zde bz to byl DATADIR | ||
+ | - upravit impor funkce a doplnit jméno knihovny o relativní cestu (vůči DATADIR) k ní, např. | ||
+ | '' | ||
- | Poslední možnost bude asi pro naše potřeby nejvhodnější. | + | Doporučoval bych některou z posledních tří možností. |
</ | </ | ||
Line 142: | 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> | ||
+ | |||
+ | * 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, | ||
+ | ... | ||
+ | |||
+ | //volání a převzetí vráceného textu | ||
+ | const MAX_BUFR_LENGTH=256; | ||
+ | |||
+ | var sBuffer: | ||
+ | // !! bude na konci sBuffer obsahovat prazdny text, | ||
+ | // !! protoze 1. byt znaku bude mit hodnotu 0 | ||
+ | // !! a to bude chapano jako konec textu | ||
+ | iLen: | ||
+ | begin | ||
+ | ... | ||
+ | SetLength(sBuffer, | ||
+ | iLen: | ||
+ | SetLength(sBuffer, | ||
+ | ... | ||
+ | end; | ||
+ | </ | ||
+ | |||
+ | 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, | ||
+ | return(strlen(sBuffer)); | ||
+ | } | ||
+ | </ |
user/skripty/dlls.1473231187.txt.gz · Last modified: 2016/09/07 00:00 (external edit)