IBM Open Class FAQ

Transcript

IBM Open Class FAQ
Stéphane Charette
OpenClass Frequently Asked
Questions
2 Novembre 1997
Open Class Library (OCL) FAQ © Stéphane Charette, 1997
Traduzione per PIDO/2: Mentore Siesto, 2008
Indice
Capitolo e sezione
1. Informazioni generali
Pagina
4
a) Storia della Open Class Library FAQ
4
b) Ottenere una copia della FAQ
4
c) Dove ottenere ulteriori informazioni
5
d) Indice degli esempi su Hobbes2
6
2. OCL - Compilare
8
a) Come compilare il codice
8
b) Parametri di compilazione obbligatori
9
c) Errori nei file header di IBM
9
3. OCL - Linking
10
a) Come effettuare il linking
10
b) Linking statico
11
c) Linking dinamico
12
4. OCL - Varie
14
a) L'applicazione muore all'avvio
14
b) Finestre application-modal
15
c) Finestre system-modal
15
d) Assegnare un'icona a una finestra
15
e) Impedire la sovrascrittura dell'icona di un'applicazione minimizzata
16
f) Stampare
17
g) Convertire un elemento nativo di PM alle OCL
18
h) Creare un thread
19
i) Valueset (WC_VALUESET)
19
j) Container owner-drawn
20
5. OCL - Errori
21
a) Errore EDC3086
21
b) Errore LNK2029
22
c) Errori EDC0166, EDC0275, EDC0045 e EDC0046
22
6. OCL - Fixpack e CSD
23
7. Contributori
24
1. Informazioni generali.
1.a. Storia della Open Class Library FAQ.
La Open Class Library FAQ è mantenuta da Stéphane Charette.
Questa è la storia delle revisioni:
Versione
Commento
Autore Data
0.1
Stesura iniziale informato .INF
SC
20-21 Giugno 1997
0.1a
Aggiunta una tabella di file su Hobbes
SC
24 Giugno 1997
0.1b
Conversione della FAQ in formato HTML
SC
28 Giugno 1997
SC
5 Settembre 1997
SC
2 Novembre 1997
Aggiunto un esempio sull'animazione
0.1d
Aggiunte informazioni sull'errore LNK2029
Aggiornate le informazioni sui fixpak
Creata la pagina "Errori nei file include di IBM"
Modificato l'indirizzo di e-mail
0.1e
Aggiunto POV_Launch all'elenco su Hobbes
Aggiunte le informazioni sulla grafica nei
container
Questo documento è classificato come RFC (request for comment); qualsiasi informazione o
correzione aggiuntiva dovrebbe essere portata all'attenzione dell'autore del documento
originale all'indirizzo [email protected].
1.b. Ottenere una copia della FAQ.
Per ottenere una copia in formato HTML dell’originale di questa FAQ, si può scaricare il file
presente in http://hobbes2.nmsu.edu/download/pub/os2/dev/cplusplus/ocl_faq.zip.
Una volta scaricato il file, decomprimetelo con unzip (pkunzip /d, oppure usando l’Archive
Viewer di eComStation 1.2 e successivi, o con altre utilità) per poterlo visionare con un
qualsiasi browser.
1.c. Dove ottenere ulteriori informazioni.
La guida in linea per le OCL è nella cartella VisualAge, sotto la cartella “VisualAge C++
Information”.
Il file .INF di riferimento ha nome Open Class Library Reference
(D:\IBMCPP\HELP\CLREF.INF). Un'ulteriore guida utente in formato INF è chiamata Open
Class Library User's Guide (D:\IBMCPP\HELP\CPPCLSUG.INF).
Il primo libro in linea, Open Class Library Reference, contiene tutti i metodi, gli oggetti e i file
include necessari documentati. Il modo più semplice per trovare quel che cercate è forse di
fare click su Classes By Name, che normalmente è la seconda opzione a partire dall'alto
(potrebbe dipendere dalla versione della documentazione).
È facile trascurare uno dei file INF più utili, tra quelli forniti da IBM con VisualAge; nella
cartella VisualAge C++ Information si trova un file INF di nome VisualAge C++
Frequently Asked Questions, che contiene diverse voci sulle OCL.
Ulteriori informazioni sulla programmazione con le OCL possono essere ottenute da diverse
sorgenti. Diversi libri sono stati pubblicati (anche da IBM) relativamente alle OCL, e sono
presenti varie fonti di informazione su Internet. Potete inoltre consultare:
D:\IBMCPP\SAMPLES\IOC\*
ftp://hobbes.nmsu.edu/pub/os2/dev/cplusplus/ocl*.zip (indice degli esempi)
ftp://service.boulder.ibm.com/ps/products/visualagecpp/tools (Codice sorgente per IBM
Visual Builder e OCL)
http://www.davebsoft.com/Programming/tips (Dave Briccetti's OS/2 Warp Programming
Tips and Samples)
News server su OCL di Taligent
Alcuni libri su OCL:
OS/2 Class Library: Power GUI programming with C/Set++
Leon, Law, Love Tsuji & Olson - John Wiley & Sons
ISBN 0-471-13117-2 (Obsoleto e sostituito dal seguente)
Power GUI Programming with VisualAge C++
Law, Love, Olson & Tsuji
John Wiley & Sons - ISBN 0-471-16482-8
(raccomandato da Mark Anderson, [email protected])
1.d. Indice degli esempi su Hobbes2.
A partire dalla metà di Giugno del 1997, ho iniziato a inserire su Hobbes2 (URL:
http://hobbes2.nmsu.edu/h-browse.php?dir=/pub/os2/dev/cplusplus)
una
serie di esempi sulla Open Class Library scritti da me. La seguente tabella è un indice per
gli esempi.
Nome file
Descrizione
Classi usate
IApplication, IColor, IDrawingCanvas, IEvent,
OCL_ANI1.ZIP
esempio di animazione IFrameWindow, IGBitmap, IGList, IRectangle,
ITimer
OCL_CON1.ZIP
esempio sui container:
vista dettagli
esempio su thread e
OCL_THR1.ZIP
timer (spiegazione per
l'icona minimizzata)
IApplication, IContainerColumn,
IContainerControl, IContainerObject,
IFrameWindow, IString
IApplication, ICommandEvent,
ICommandHandler, IFrameWindow, IListBox,
IPushButton, IString, ISystemMenu, IThread,
IThreadFn, ITimer
IApplication, ICommandEvent,
ICommandHandler, IColor, IControlEvent,
OCL_ANI2.ZIP
secondo esempio di
animazione
IDrawingCanvas, IFrameWindow,
IFrameEvent, IFrameHandler, IGBitmap,
IGList, IGraphicContext, IMouseClickEvent,
IMouseHandler, IPopUpMenu,
ITimerMemberFn0
disegno personalizzato IApplication, ICnrDrawHandler,
OCL_CON2.ZIP
in un container in vista IContainerColumn, IContainerControl,
dettagli
IContainerObject, IFrameWindow
Quasi tutte le classi disponibili, inclusi thread,
PLNCH01G.ZIP
POV front-end
canvas, icone, bitmap, control standard, profili
ed eccezioni.
Consultare anche 1.c. Dove ottenere ulteriori informazioni.
2. OCL – Compilare
2.a. Come compilare il codice.
Per compilare correttamente un’applicazione OCL, seguite le regole qui sotto tratteggiate:
Se state usando le maschere dei progetti e di WorkFrame distribuite insieme a Visual Age
for C++:
1. fate click su Tools
2. assicuratevi che View sia impostato ad Actions
3. espandete il sottoalbero Compile
4. fate click con il bottone 2 del mouse su C++ Compiler
5. selezionate File Options
6. selezionate la linguetta Object
7. selezionate l’opzione Multithread in Library Selection (verrà impostato il
parametro /Gm+ del compilatore C/C++)
8. fate click su OK
9. chiudete Tools setup
10.rigenerate il makefile e compilate
Se state compilando da linea di comando, o utilizzate makefile creati da voi, è sufficiente
usare il comando icc.exe /Gm+ /C <altri flag> mio_file.cpp.
Consultate anche le sezioni seguenti: 2.b. Parametri di compilazione obbligatori, 3.a. Come
effettuare il linking, 3.b. Linking statico e 3.c. Linking dinamico.
2.b. Parametri di compilazione obbligatori.
Un flag dei parametri di compilazione è indispensabile per compilare codice sorgente che
utilizza chiamate alle OCL. Questo è /Gm+, che forza il linking con le librerie di runtime
multithread del Visual Age for C++ - secondo quanto dice la descrizione nelle guide in linea.
ICC.EXE, per default, utilizza il flag /Gm- (nessun supporto alle librerie multithread), per cui
il flag /Gm+ dev’essere specificato esplicitamente. Il comportamento tipico del compilatore,
in caso non si segua questa indicazione, è il seguente flusso di errori:
D:\IBMCPP\INCLUDE\ibase.hpp(226:3) : error EDC3086:
Error: Use of IBM Open Class Library requires the /Gm+ compiler option.
D:\IBMCPP\INCLUDE\ibase.hpp(227:3) : error EDC3086:
Check the makefile (or its profile) for a missing /Gm+ option.
Nota: consultare anche le sezioni 2.a. Come compilare il codice, e 5.a. Errore EDC3086.
2.c. Errori nei file header di IBM.
Se il vostro codice sorgente ha estensione .c, e includete alcuni dei file header delle OCL, il
compilatore potrebbe generare molti errori apparentemente provenienti proprio dai file
include di IBMCPP. Questi errori sono causati dal fatto che il compilatore presuppone che i
file “.c” contengano solo codice C, non C++, mentre i file header delle OCL richiedono al
compilatore di disporsi in modalità C++.
Per aggirare il problema è possibile usare il flag /Tdp, per informare il compilatore ICC.EXE
di trattare tutti i file come file C++.
Tra gli errori generati dal compilatore in caso contrario, i seguenti sono un esempio:
imsgtext.hpp(24:1)
:
error
EDC0166:
Definition
of
function
class
requires
parentheses.
imsgtext.hpp(24:7) : error EDC0275: Unexpected text IMessageText encountered.
imsgtext.hpp(27:19) : error EDC0046: Syntax error.
imsgtext.hpp(28:33) : error EDC0045: Undeclared identifier messageFileName.
imsgtext.hpp(29:33) : error EDC0045: Undeclared identifier textInsert1.
Consultare anche 2.a. Come compilare il codice.
3. OCL – Linking.
3.a. Come effettuare il linking.
Il metodo raccomandato per effettuare il link della vostra applicazione, nel caso in cui uno o
più file oggetto riferiscano chiamate di funzione alle OCL, è di usare direttamente ICC.EXE
invece di LINK, LINK386, ILINK o altri linker.
Seguite questi passi nel collegare un file oggetto (.OBJ) che usa le OCL:
Se usate le maschere di progetto e WorkFrame distribuiti con VisualAge for C++:
1. fate click su Tools
2. assicuratevi che View sia impostato ad Actions
3. fate click con il bottone 2 del mouse su Link
4. fate click su Add
5. assicuratevi di avere impostato i seguenti valori:
general.class == Link
general.name == Link (OCL)
general.program == ICC.EXE
general.session == MONITOR
general.action vale FILE, non PROJECT
types.source == LinkerIn
types.target == LinkerOut
support.name == CPPICL30
support.entrypoint == LINK
fate click su OK
6. chiudete Tools setup
7. rigenerate il makefile per usare i nuovi metodi di link, ricompilate e collegate.
Se effettuate il link da linea di comando, o usate makefile prodotti da voi, usate il
comando icc.exe <altri flag> /B” /pmtype:pm” miofile.obj.
Consultare anche: 2. Come compilare il codice, 3.b. Linking statico e 3.c. Linking dinamico.
3.b. Linking statico.
Il collegamento statico combina i file della IBM Open Class Library con i file oggetto da voi
prodotti per creare un’applicazione singola. Non è quindi necessario avere una copia dei file
DDE4*.DLL in X:\IBMCPP\DLL per lanciare l’applicazione.
L’effetto collaterale di quest’azione è un aumento delle dimensioni dell’eseguibile.
Per utilizzare il linking statico, è necessario specificare il parametro /Gd- (predefinito)
durante la compilazione dei file .CPP. Questa impostazione può essere effettuata nei
seguenti due modi:
Se utilizzate le maschere di progetto e di WorkFrame distribuite con Visual Age:
1. fate click su Tools
2. accertatevi che View sia impostato ad Actions
3. espandete il sottoalbero Compile
4. fate click con il bottone 2 del mouse su C++ Compiler
5. selezionate File Options
6. selezionate la linguetta Object
7. selezionate l’opzione Static nel campo Library linkage
8. fate click su OK
9. chiudete Tools setup
10.rigenerate il makefile e ricompilate
Se state compilando da linea di comando, o utilizzate makefile prodotti da voi, specificate
direttamente l’opzione /Gd-.
Consultare anche: 3.c. Linking dinamico, e 3. Come effettuare il linking.
Annotazione (NdT): consultate attentamente la documentazione in linea e cartacea fornita
con VisualAge for C++, a riguardo della licenza di distribuzione per le DLL runtime e OCL
fornite da IBM. In essa sono specificate chiaramente le condizioni sotto le quali è possibile
distribuire le DLL complete o ridotte, relative alle librerie protette da copyright IBM.
3.c. Linking dinamico.
Il linking dinamico imposta l’applicazione per chiamare le funzioni OCL dinamicamente
tramite l’uso di DLL. È pertanto necessario che le DLL contenenti le librerie Open Class
siano già presenti e riferite dalla variabile LIBPATH del file CONFIG.SYS, prima che
l’applicazione venga lanciata.
Il linking dinamico è un processo più rapido e comporta un’applicazione risultante più
piccola, rispetto al linking statico. Il difetto del linking dinamico è che, se le DLL mancano dal
sistema su cui si vuole eseguire l’applicazione, sarà impossibile lanciarla.
NdT: altri problemi possono derivare, per applicazioni particolarmente onerose, dalla
frammentazione e dal riempimento della shared arena della memoria gestita dal sistema
OS/2. Questo argomento viene trattato in altre pubblicazioni relative, presenti anche sul sito
del PIDO/2.
Per utilizzare il linking dinamico, si deve specificare il parametro /Gd+ (non predefinito!)
durante la compilazione di file .CPP. Si possono usare due metodi per cambiare questa
impostazione.
Se utilizzate le maschere di progetto e di WorkFrame distribuite con Visual Age:
1. fate click su Tools
2. accertatevi che View sia impostato ad Actions
3. espandete il sottoalbero Compile
4. fate click con il bottone 2 del mouse su C++ Compiler
5. selezionate File Options
6. selezionate la linguetta Object
7. selezionate l’opzione Dynamic nel campo Library linkage
8. fate click su OK
9. chiudete Tools setup
10.rigenerate il makefile e ricompilate
Se state compilando da linea di comando, o utilizzate makefile prodotti da voi, specificate
direttamente l’opzione /Gd+.
Consultare anche: 3.b. Linking statico, e 3. Come effettuare il linking.
Annotazione (NdT): consultate attentamente la documentazione in linea e cartacea fornita
con VisualAge for C++, a riguardo della licenza di distribuzione per le DLL runtime e OCL
fornite da IBM. In essa sono specificate chiaramente le condizioni sotto le quali è possibile
distribuire le DLL complete o ridotte, relative alle librerie protette da copyright IBM.
4. OCL – Varie.
Indice della sezione:
a) L'applicazione muore all'avvio
b) Finestre application-modal
c) Finestre system-modal
d) Assegnare un'icona a una finestra
e) Impedire la sovrascrittura dell'icona di un'applicazione minimizzata
f) Stampare
g) Convertire un elemento nativo di PM alle OCL
h) Creare un thread
i) Valueset (WC_VALUESET)
j) Container owner-drawn
4.a. L’applicazione muore all’avvio
Se la vostra applicazione compila e viene collegata senza problemi, ma abortisce al lancio
(la frame della finestra può comparire o meno), controllate i seguenti errori più frequenti:
Più risorse condividono forse uno stesso ID nei file RC o DLG?
State cercando di creare o allocare una risorsa nel file CPP (per esempio, un
IPushButton) già definita altrove in un file RC o DLG?
Un consiglio di Bill Law ([email protected]): una delle più frequenti cause per questo
comportamento è che l’applicazione lancia un’eccezione non recuperata durante la
creazione della frame window. L’applicazione termina quindi silenziosamente, a meno
che non si riesca a catturare l’eccezione lanciata. A questo scopo, seguite le informazioni
fornite nella VACPP FAQ, nella sezione “Coding With User Interface Classes”, alla voce
“Exceptions -> Why Does My Program Just Exit”. Questa FAQ si trova in
X:\IBMCPP\HELP\CPPFAQ.INF, in lingua Inglese.
Avete specificato il tipo di applicazione in fase di linking? Se l’applicazione viene
compilata con il tipo predefinito /pmtype:vio, la finestra non potrà apparire. Accertatevi
di aver usato /pmtype:pm dal linker, oppure l’opzione /B” /pmtype:pm” nell’uso
diretto dal compilatore (linea di comando).
4.b. Finestre application modal
Per creare una finestra application modal, la genitrice e la titolare della finestra da creare
devono essere diverse tra loro. L'handle della finestra genitrice dovrebbe quello della
finestra desktop (HWND_DESKTOP), mentre l'handle della finestra titolare dovrebbe essere
quello della finestra chiamante.
Per esempio:
IFrameWindow *anotherDlg =
new IFrameWindow( MY_RES_ID,
/* resource id of new window */
desktopWindow(),
/* parent window handle */
this );
/* owner window handle */
anotherDlg->showModally();
4.c. Finestre system-modal.
Questa sezione al momento non contiene argomenti. Verrà riempita non appena avrò
qualche contributo valido (NdT: ovviamente vale anche per la versione Italiana…).
4.d. Assegnare un’icona a una finestra.
Nel file RC si deve assegnare un’icona allo stesso ID di risorsa usato dalla dialog window
nel file .DLG; tale risorsa va caricata al momento di creare la finestra. Ciò si fa come segue:
1 – nel file .H, avrete qualcosa del tipo
#define MY_DIALOG_RCID
0x1000
2 – Nel file .RC, avrete qualcosa del tipo
ICON MY_DIALOG_RCID myicon.ico
3 – Nel file .DLG avrete qualcosa del tipo
DLGTEMPLATE MY_DIALOG_RCID PRELOAD MOVEABLE DISCARDABLE
BEGIN
DIALOG
"My Dialog Title", MY_DIALOG_RCID, ...
4 – Nel file CPP avrete invece
IFrameWindow *myDlg = new IFrameWindow( MY_DIALOG_RCID ); // crea la finestra
myDlg->setIcon( MY_DIALOG_RCID );
// associa l’icona
Consultare anche la voce seguente.
4.e. Impedire la sovrascrittura dell'icona di un'applicazione minimizzata
Se la vostra dialog contiene o consiste di un canvas, al momento in cui minimizzate la
finestra l’icona usata (IFrameWindow::setIcon()) viene tracciata correttamente sullo
schermo. Se però avete alcuni control fuori dal canvas, noterete che l’icona dell’applicazione
minimizzata viene sovrascritta con alcuni dei vostri control.
Questo problema è comune, probabilmente capita anche con le applicazioni PM native: è
però facile da correggere.
Nell’applicazione è necessario creare un command handler perché la finestra possa
catturare tutti i comandi di sistema. Ciò può essere fatto ereditando da ICommandHandler,
e dichiarando la funzione Boolean systemCommand (ICommandEvent &event);. A
questo punto, qiando viene rilevato l’evento ISystemMenu::idMinimize, si deve
chiamare hide () sui control che creano il problema.
Similmente, quando viene rilevato l’evento ISystemMenu::idRestore, basterà lanciare
show () sui control precedentemente nascosti. Per esempio:
/* Questo è in parte pseudo-codice: non compilerà senza modifiche */
class myClass : public IFrameWindow, public ICommandHandler
{
myClass() :
// Costrutture della classe…
IFrameWindow(...),
// ...ereditato da IFrameWindow...
ICommandHandler() {;};
// ...e da ICommandHandler
Boolean systemCommand( ICommandEvent &event );
// ereditato da
// ICommandHandler
};
int main()
{
myClass *frame = new myClass();
// crea classe
frame->setIcon( MY_ICON_RCID );
// imposta icona predefinita
frame->(ICommandHandler)handleEventsFor( frame );
// imposta handler
...fai altre cose in questo frammento...
frame->(ICommandHandler)stopHandlingEventsFor( frame );
// ferma handler
return 0;
}
myClass::systemCommand( ICommandEvent &event )
{
if( event.commandId() == ISystemMenu::idMinimize )
{
...nasconde i control che sovrascrivono l’icona chiamando hide()...
}
if( event.commandId() == ISystemMenu::idRestore )
{
...mostra i Control che sovrascrivono l’icona chiamando show()...
}
return false;
// ritorna, come se l’evento non fosse stato gestito
}
Consultare anche: 4.d. Come assegnare un’icona a una finestra, e 1.d. Indice degli esempi
su Hobbes2.
4.f. Stampare
Alla versione delle Open Class inclusa con VisualAge for C++ versione 3, il supporto per la
stampa direttamente da OCL non è ancora presente. IBM promise di aggiungerlo “presto”,
ma senza dare alcuna data.
Al tempo presente non è possibile avere aggiornamenti delle Open Class, abbandonate da
IBM dopo Visual Age for C++ versione 4.
Conviene pertanto riferirsi ad altre fonti per la stampa con i metodi tradizionali.
4.g. Convertire un elemento nativo di PM alle OCL
La maggior parte delle finestre native di PM ha un equivalente in OCL, e un elemento
esistente in una finestra può venire convertito in chiamate OCL in qualsiasi momento. Il
vantaggio è evidente se alcune funzionalità che vi servono sono state già implementate in
OCL. Per esempio:
> Può un puntatore a una listbox ‘low level’ venire convertito in
> un puntatore a una listbox in Open Class?
Dave Briccetti ([email protected]) dice quanto segue:
La maggior parte dei control UI OpenClass ha un costruttore che prende come argomento
l’HWND di un control esistente. In questo caso, il costruttore sarebbe simile a questo:
IListBox (const IwindowHandle &)
dove IWindowHandle fa da “Alias” per HWND.
Bill Law ([email protected]) aggiunge inoltre quanto segue:
Bisogna forse aggiungere che se una finestra OCL esiste già per un HWND dato, costruirne
un’altra dal suo HWND genererà un’eccezione. Generalmente, se c’è una possibilità che una
finestra OCL esistente esista (o, se sapete che una tale finestra esiste e volete individuarla),
si può usare IWindow::fromHandle per ottenere l’oggetto di classe IWindow, o di una
classe derivata. Se la funzione restituisce 0, si può costruire senza problemi un altro oggetto
di classe IWindow o derivata da essa.
4.h. Creare un thread.
Esistono vari modi per creare thread in OCL. Il metodo da scegliere dipende dal compito
che si vuole assegnare al thread stesso.
Esempio: creazione di un thread per chiamare un metodo oggetto:
MyDlgClass
*frame
= new MyDlgClass();
IThreadMemberFn
*myThreadMemberFn = new IThreadMemberFn(frame,
MyDlgClass::doSomething) );
IThread
*myThread
= new IThread( myThreadMemberFn );
Esempio: creazione di un thread per chiamare un’intera classe:
class MyThreadClass : public IThreadFn
...
int main()
{
...
MyThreadClass
*myThreadFn = new MyThreadClass();
IThread
*myThread
= new IThread( myThreadFn );
Attenzione: usando IThreadFn, piuttosto che IThreadMemberFn, la classe da creare
deve ereditare da IThreadFn, e deve contenere il metodo run ().
Consultare anche 1.d. Indice degli esempi su Hobbes2.
4.i. Valueset (WC_VALUESET).
Apparentemente, le Open Class non supportano direttamente il control WC_VALUESET. È
comunque possibile crearli tramite DLGEDIT e accedere a essi con codice OCL, ma vi sono
alcune limitazioni da tenere in considerazione.
Nel codice è possibile usare
IWindow *vs = new IWindow( MY_VALUESET_RCID, this );
Successivamente è possibile cambiare tutti gli attributi standard di finiestra utilizzando le
chiamate OCL. Tutte le informazioni specifiche dei Valueset devono però essere gestite
utilizzando direttamente la programmazione standard di PM.
4.j. Container owner-drawn.
Per disegnare direttamente i propri elementi in un container (IContainerControl) è
necessario utilizzare la classe ICnrDrawHandler. Per avere un esempio di come utilizzare
tale sistema in un container in Vista Dettagli (ma lo stesso sistema si può usare per le altre
modalità di visualizzazione) consultate l’esempio OCL_CON2 su Hobbes.
Consultare anche 1.d. Indice degli esempi su Hobbes2.
5. OCL – Errori.
5.a. Errore EDC3086.
L’errore EDC3086 si ottiene quando il compilatore rileva chiamate ai metodi OCL in un file
sorgente non compilato con il parametro /Gm+. È possibile correggere l’errore assicurandosi
di compilare il programma con le librerie multithread.
Consultare anche 2. Come compilare il codice e 2.b. Parametri del compilatore obbligatori.
5.b. Errore LNK2029.
L’errore LNK2029 viene causato dal linker, se il sorgente contiene chiamate OCL, ma la
compilazione non è avvenuta con il parametro /Gm+. L’errore può apparire in questa forma:
CPPOOC3.LIB (iexcept.cpp) : error LNK2029: "_errno" : unresolved external
Charlie Choc ([email protected]) dice quanto segue:
Assicuratevi di compilare il sorgente con l’opzione /Gm+: le Open Class Library richiedono
l’uso dell’opzione multithread. In un ambiente multithread _errno è una funzione; in un
ambiene single thread, invece, è solo un int.
Un’altra condizione che causa l’errore LNK2029 si ha quando un metodo per una classe è
stato dichiarato, ma non definito in alcuno dei file sorgente. Per esempio, il linker genererà
l’errore
test.obj(test.cpp)
:
error
LNK2029:
"{MyWindow}IVBase::virtual-fn-table-ptr"
:
unresolved external
compilando e collegando il file sorgente che segue: (nota: anche se il costruttore è stato
dichiarato e definito, il distruttore non è stato definito)
#include <iframe.hpp>
class mywindow : public IFrameWindow
{
public:
MyWindow();
~MyWindow();
};
MyWindow::MyWindow() : IFrameWindow()
{
return; }
int main()
{
return 0; }
Consultare anche 2.b. Parametri del compilatore obbligatori e 3.a. Come effettuare il linking.
5.c. Errori EDC0166, EDC0275, EDC0045 e EDC0046.
Se il codice sorgente ha estensione .c e include alcuni file header OCL, il compilatore
genererà errori in apparenza dovuti ai file header IBMCPP. Questi errori vengono generati
perché il compilatore presume che i file .c contengano solo codice C e non C++, mentre le
OCL richiedono che il compilatore lavori in modalità C++.
Per aggirare il problema è necessario usare il parametro /Tdp per dire a VAC++ di trattare
tutti i file come file C++. Tra gli errori citati, un esempio:
imsgtext.hpp(24:1) : error EDC0166: Definition of function class requires
parentheses.
imsgtext.hpp(24:7) : error EDC0275: Unexpected text IMessageText encountered.
imsgtext.hpp(27:19) : error EDC0046: Syntax error.
imsgtext.hpp(28:33) : error EDC0045: Undeclared identifier messageFileName.
imsgtext.hpp(29:33) : error EDC0045: Undeclared identifier textInsert1.
Consultare anche 2. OCL - compilare.
6. OCL – Fixpack e CSD.
Gli ultimi CSD disponibili da IBM per Visual Age C++ 3 sono disponibili gratuitamente al sito
ftp://service.boulder.ibm.com/ps/products/visualagecpp/fixes.
Per utenti della versione Inglese USA di VisualAge per OS/2, sono necessari tutti i file
presenti in ftp://service.boulder.ibm.com/ps/products/visualagecpp/fixes/v30os2/english-us/fixpak7.
(Le informazioni relative all’utenza Win32 sono state escluse da questa versione delle FAQ,
che è riservata esclusivamente agli utenti eComStation e OS/2).
Nota: questo fixpack rappresenta oltre 20 MiB di file compressi. Potrebbe essere opportuna
un’operazione di pianificazione.
Nota: il file cts306.zip generalmente non è necessario, in quanto è un sorgente corretto
delle Open Class Library Source File: questo è un prodotto separato, acquistabile da IBM (in
passato) al costo di parecchie migliaia di dollari e non incluso nell’acquisto normale di Visual
Age for C++.
Per applicare i fixpack, seguite l’ordine prescritto da IBM (VAC++ 3.0 per OS/2):
1. Riavviare
2. CTC308
3. CTO308
4. CTW308
5. Riavviare
6. CTV308
7. CTD308
8. CTU308
9. Riavviare
10.CTS308 può essere applicato se si dispone dell’OpenClass source code.
7. Contributori.
Questo documento è dovuto a molti aiuti esterni. Tra questi, i seguenti sono stati così gentili
da fornire suggerimenti, trucchi, esempi e altro:
Stéphane Charette, [email protected]
Charlie Choc, [email protected]
Mark Anderson, [email protected]
Dave Briccetti, [email protected]
Bill Law, [email protected]
Tsung-Hsun Yang, [email protected]
Finito di tradurre il 31/10/2008 da Mentore Siesto ([email protected]).