Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania

Transkrypt

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania
INFORMATOR TECHNICZNY WONDERWARE
Informator Techniczny nr 60
04-12-2002
Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania
InTouch
Wstęp
PoniŜsza dokumentacja oparta na przykładach stworzonych w środowisku Visual C++ przedstawia etapy
postępowania w celu stworzenia i wykorzystania biblioteki DLL w skryptach oprogramowania InTouch.
Omówienie
Bibliotekami DLL, które mogą być wykorzystane w skryptach oprogramowania InTouch są regularne
biblioteki DLL gdyŜ w porównaniu z innymi typami bibliotek tylko te eksportują funkcje z biblioteki DLL, a
nie z klas C++.
Proces tworzenia regularnej biblioteki DLL rozpoczynamy od utworzenia nowego projektu określając typ
projektu jako MFC AppWizard (dll). W oknie kreatora biblioteki DLL określamy jej typ jako bibliotekę
regularną.
Wybór projektu biblioteki DLL w Kreatorze aplikacji.
ASTOR Sp. z o.o.
Dział Oprogramowania Przemysłowego
ul. Smoleńsk 29, 31-112 Kraków
tel.: 012 428-63-30
fax: 012 428-63-09
e-mail: [email protected]
http://www.astor.com.pl
Określenie typu biblioteki DLL.
Po utworzeniu podstawowej powłoki biblioteki, tworzymy nową klasę typu Generic, w której
umieszczamy funkcje biblioteczne. W celu eksportowania zbudowanych funkcji naleŜy zadeklarować je
jako „funkcje eksportowe”, stosując następującą konstrukcję :
extern “C” <typ funkcji> PASCAL EXPORT
<deklaracja funkcji>
NaleŜy tego dokonać zarówno w prototypie funkcji w pliku nagłówkowym (.h) jak i w pliku kodu
źródłowego (.cpp). Ponadto naleŜy wyeliminować w kodzie źródłowym stworzonej klasy konstruktor i
destruktor, zaś w pliku nagłówkowym kaŜdy ślad rzeczywistej klasy, pozostawiając jedynie wywołania
funkcji. Modyfikacje te przedstawiają poniŜsze przykłady.
Kod źródłowy klasy mocczynnaTg. Przykład funkcji zwracającej wartość mocy czynnej Turbogeneratora.
// mocczynnaTg.cpp: implementation of the mocczynnaTg class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "mocczynna.h"
#include "mocczynnaTg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
2
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//mocczynnaTg::mocczynnaTg()
//{
//}
//mocczynnaTg::~mocczynnaTg()
//{
//}
extern "C" float PASCAL EXPORT mocczynnaTg(float k1,float k2, int Q_MPEC, int Q_STOMIL, int
Q_STAB,
int Q_3_0, int Q_1_7, int
Q_0_8)
{
int Q_CO,Q_TECH;
Q_CO=Q_MPEC+Q_STOMIL+Q_STAB;
Q_TECH=Q_3_0+Q_1_7+Q_0_8;
return (k1*Q_CO+k2*Q_TECH);
}
Plik nagłówkowy klasy mocczynnaTg
// mocczynnaTg.h: interface for the mocczynnaTg class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MOCCZYNNATG_H__6DC3A3BA_C943_11D6_9B77_0080C8F63767__INCLUDED_)
#define AFX_MOCCZYNNATG_H__6DC3A3BA_C943_11D6_9B77_0080C8F63767__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//class mocczynnaTg
//{
//public:
//
mocczynnaTg();
//
virtual ~mocczynnaTg();
//};
extern "C" float PASCAL EXPORT mocczynnaTg(float k1,float k2, int Q_MPEC, int Q_STOMIL, int
Q_STAB,int Q_3_0, int Q_1_7, int Q_0_8);
#endif // !defined(AFX_MOCCZYNNATG_H__6DC3A3BA_C943_11D6_9B77_0080C8F63767__INCLUDED_)
3
Po skompilowaniu klasy, naleŜy zmodyfikować plik DEF projektu biblioteki dodając do niego wszystkie
nazwy wyeksportowanych funkcji, tak jak na poniŜszym przykładzie:
; mocczynna.def : Declares the module parameters for the DLL.
LIBRARY
DESCRIPTION
"mocczynna"
'mocczynna Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
mocczynnaTg
Po zbudowaniu biblioteki DLL naleŜy stworzyć plik z rozszerzeniem wdf. Dzięki temu plikowi
WindowMaker jest w stanie rozpoznać stworzoną bibliotekę DLL. Plik ten specyfikuje sekwencje
wywołania funkcji, informacje o pliku pomocy oraz informacje o przekazaniu połączenia. Plik ten tworzy
się korzystając z programu Crypt.exe zawartego w Extensibility Toolkit przy pomocy wejściowego
pliku definicji (.idf).Komenda tworząca plik wdf wygłąda następująco:
CRYPT <infile>.idf <outfile>.wdf /e
Dokładny opis tworzenia pliku idf zawarty jest w rozdziale 9 Wonderware Extensibility Toolkit Users
Guide. PoniŜej został przedstawiony streszczony opis tworzenia pliku idf na bazie zbudowanej biblioteki
mocczynna.dll.
Plik typu idf składa się przede wszystkim z ciągu nazw wywołań, plików, flag, bibliotek, funkcji, sposobu
przesyłania argumentów funkcji oraz typów samej funkcji jak i jej argumentów. Komentarze w pliku idf
zaznaczone są znakiem średnika ; . Przykładowy plik idf wygląda następująco:
;
; mocczynna.IDF
;
Version=1
, , ,- puste miejsca oddzielone przecinkiem i spacją ; tu wpisuje
się nazwę pliku pomocy i jego parametry.
MocCzynnaTg, , ,0,0x08000028,pastemocczynnaTg,MOCCZYNNA,MOCCZYNNA,
mocczynnaTg,PASCAL,float,float,float,int,int,int,int,int,int
typ zwracany
typy argumentów funkcji
Opis nazw:
• MocCzynnaTg – dowolna nazwa reprezentująca daną funkcję biblioteczną w zestawieniu
wszystkich dostępnych skryptów w InTouch’u.
• 0 – oznacza iŜ dana funkcja będzie zwracać jakąś wartość; dla void stosuje się 1.
• 0x08000028 – zestaw flag, młodsze słowo zawiera informacje gdzie i w jaki sposób dana funkcja
moŜe być uŜyta , starsze słowo zawiera informacje dotyczące rodzaju skryptu do jakiego ma być
dana funkcja przypisana np. Math Function.
• pastemocczynnaTg – nazwa funkcji przekazująca krótką definicję danej funkcji.
• MOCCZYNNA – nazwa biblioteki DLL zawierająca funkcję pastemocczynnaTg.
• mocczynnaTg – nazwa wykorzystywanej funkcji z biblioteki DLL.
• PASCAL – sposób przekazywania argumentów funkcji.
4
Funkcja przekazująca definicję danej funkcji ma za zadanie w momencie wybrania jej przez uŜytkownika
ze zbioru dostępnych skryptów wyświetlić zbiór argumentów uŜywanych przez daną funkcję. Dzięki
uŜyciu makra MAKELONG definiuje się długość podświetlanego tekstu w definicji danej funkcji.
Funkcja pastemocczynnaTg mieści się w pliku kodu źródłowego klasy mocczynnaTg. Jej postać jest
następująca:
extern "C" long PASCAL EXPORT pastemocczynnaTg(LPSTR funcName, LPSTR result )
{
long hilite=0;
lstrcpy( result, funcName );
if( lstrcmpi(funcName, "MocCzynnaTg") == 0 ) {
lstrcat( result, " (k1,k2,Q_MPEC,Q_STOMIL,Q_STAB,Q_3_0,Q_1_7,Q_0_8);" );
hilite = MAKELONG(11,19);
}
return( hilite );
}
NaleŜy pamiętać o zadeklarowaniu tej funkcji w pliku nagłówkowym mocczynnaTg.h
extern "C" long PASCAL EXPORT pastemocczynnaTg(LPSTR funcName, LPSTR result );
oraz o dodaniu jej nazwy do pliku DEF.
Po ponownym skompilowaniu i zbudowaniu biblioteki mocczynna.dll oraz po utworzeniu na podstawie
biblioteki i pliku mocczynna.idf pliku mocczynna.wdf uzyskuje się kompletne narzędzie do
zastosowania we skryptach oprogramowania InTouch. Aby dana funkcja ze zbudowanej biblioteki DLL
była widoczna we skryptach środowiska InTouch naleŜy pliki mocczynna.dll oraz mocczynna.wdf
skopiować do głównego katalogu InTouch. Po kaŜdej modyfikacji funkcji w bibliotece DLL zaleca się
ponowne utworzenie pliku wdf, po czym całość (tzn. plik wdf i bibliotekę DLL) skopiować do katalogu
InTouch i ponownie uruchomić środowisko InTouch.
5

Podobne dokumenty