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]).