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 07:59] – gord | user:skripty:dlls [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
Line 60: | Line 60: | ||
Demonstrovat řešení budu na Microsoft Visual Studiu (já konkretně mám verzi 2010). U jiných verzí MSVC to bude podobné a analogie se najde jistě u jiných kompilátorů - když se ví, co hledat, je to jednodušší. | Demonstrovat řešení budu na Microsoft Visual Studiu (já konkretně mám verzi 2010). U jiných verzí MSVC to bude podobné a analogie se najde jistě u jiných kompilátorů - když se ví, co hledat, je to jednodušší. | ||
+ | |||
+ | <WRAP tip>Pro použití knihovny je nutné, aby byla uložená tam, kde ji bude systém hledat, tedy na jednom z těchto míst: | ||
+ | |||
+ | - v některém z vhodných systémových adresářů (např \Windows\SysWOW64) | ||
+ | - 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 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ř. | ||
+ | '' | ||
+ | |||
+ | Doporučoval bych některou z posledních tří možností. | ||
+ | </ | ||
===== Dekorování jmen funkcí ===== | ===== Dekorování jmen funkcí ===== | ||
Line 133: | 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.1473227999.txt.gz · Last modified: 2016/09/07 00:00 (external edit)