background image

 

 
 

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: wonderware1@astor.com.pl 
http://www.astor.com.pl 

 

background image

 

 

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

background image

// 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

background image

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      "mocczynna" 
DESCRIPTION  '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 
 

MocCzynnaTg, , ,0,0x08000028,pastemocczynnaTg,MOCCZYNNA,MOCCZYNNA, 

, , ,- puste miejsca oddzielone przecinkiem i spacją ; tu wpisuje 
się nazwę pliku pomocy i jego parametry. 

mocczynnaTg,PASCAL,float,float,float,int,int,int,int,int,int 
 

typy argumentów funkcji

typ zwracany

 
 
 
 
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

background image

 

5

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. 
 

 


Document Outline