Q & A

Questo spazio è dedicato alla risoluzione dei vostri problemi di programmazione. Proponete domande tecniche ed otterete risposte pratiche ed esaustive ai vostri questi.

q&a@infomedia.it

 

VC++ e VB in comunicazione

Dino,
ho letto il tuo articolo "Visual C++ DLLs Need a DEF File for VB Clients" sul sito VB2theMAX. Personalmente ho a che fare col caso contrario: Chiamare funzioni dentro una DLL Visual Basic (v.6) da una applicazione Visual C++ (v.4.2).
Non ho esperienza con il C++ ma ho usato il C++ su HP/UX alcuni anni fa. Mi sto domandando se tu potessi dividere le tue conoscenze con me fornendomi alcune indicazioni su come collegarmi alla DLL e fare riferimento alle funzioni della DLL. Ogni precisazione sarà molto apprezzata.
Tanti saluti

Jesus Delgado

Risponde Dino Esposito

Non lo puoi fare per un semplice motivo. VB non può esporre funzioni pubbliche richiamabili esternamente. Puoi solo esporre funzionalità tramite COM. Nel qual caso chiamarle da VC++ è facile come chiamare un qualunque altro oggetto COM automation.

 

 

Masterizzatore che passione

Salve, ho la necessità di riconoscere (via software) un masterizzatore da un CD-ROM; spulciando le varie API ho trovato la funzione GetDriveType() con la quale riesco solo a sapere se è un CD-ROM e, purtroppo anche i masterizzatori vengono riconosciuti come tali.
Come posso distinguere i due tipi di device?
Grazie in anticipo

Gianni Luciani

Risponde Davide Quack

I masterizzatori non sono mai stati in realtà supportati molto da Windows.
È solo con win2000 che è comparso nell'SDK la sezione: "Removable Storage Manager", e con essa l'API che fa per lei: GetNtmsObjectInformation().
Se non puo limitarsi ad usare win2000 per risolvere i suoi problemi le consiglio di fare un salto su http://sourceforge.net/. Da questo sito ho scaricato tempo fa, per curiosità, il codice sorgente di un software Open Source per masterizzatori. Sono certo che tra le righe di quei sorgenti troverà quanto le serve.
Saluti

 

 

Il modo migliore

Pur usando ASP da diverso tempo non sono ancora riuscito a capire chiaramente qual’è il modo migliore per creare istanze di oggetti COM in una pagina ASP. Pur non sapendo bene perché, al momento uso sempre Server.CreateObject. Dovrei cambiare?

Luca Masini

Risponde Dino Esposito

In realtà non esistono particolari differenze tra il metodo CreateObject diretto di VBScript (o il suo equivalente JScript) e l'omonimo metodo dell'oggetto Server di ASP. In molti casi, anzi, usare uno o l'altro è assolutamente indifferente. Vi sono solo alcune circostanze da tenere presente e solo un caso in cui Server.CreateObject fa la differenza.
Innanzitutto, il motore di scripting di VBScript è leggermente e mediamente più veloce di quello di JScript, almeno per quanto riguarda la creazione di oggetti. Non si tratta di differenze abissali intendiamoci ma tutto può fare brodo quando si tratta di server.
L'unica cosa che Server.CreateObject fa in più rispetto alla più semplice CreateObject è mettere l'oggetto in condizione di effettuare chiamate agli oggetti nativi ASP quali Response e Request. In altre parole, se dovete creare un'istanza di ADO non vi è differenza alcuna. Se dovete creare un'istanza di un oggetto che internamente usa gli oggetti ASP allora è obbligatorio usare Server.CreateObject.
Un'altra considerazione interessante è che dichiarare un oggetto tramite il tag <OBJECT> offre una performance leggermente migliore non tanto in velocità quanto nell'uso della memoria. Un oggetto dichiarato come <OBJECT> infatti viene istanziato da ASP solo nel momento in cui viene effettivamente utilizzato. Mentre potete mettere in cima alla pagina una serie di tag <OBJECT> senza problemi, sappiate che una analoga serie di chiamate a Server.CreateObject oppure CreateObject creerebbe una lunga serie di oggetti COM attivi con conseguente occupazione non ottimale di memoria.

 

 

Come modificare le risorse di un programma eseguibile?

Spettabile Infomedia programmo in C++Builder da diverso tempo e vorrei sapere come è possibile modificare le icone contenute in un file eseguibile per Windows.NB: so come prelevarle (tramite la funzione di sistema ExtractIcon...), ma la documentazione MSDN non fornisce nulla circa il modo di risalvarle nel file una volta modificate.
Grazie

Stefano Antonucci

Risponde Davide Quack

Probabilmente MSDN non parla dell'API per salvare risorse modificate per il semplice motivo che l'API in questione non c'è.Naturalmente la cosa si può fare. Il prezzo è studiarsi il formato PE degli eseguibili, e il formato delle risorse. Può anche prendersi i sorgenti del compilatore Open Source MinGW, visto che in mezzo c'è anche un compilatore di risorse. Si può fare, ma sospetto con molto lavoro faticoso insomma.
Saluti

 

 

Installazione OCX

Buona giornata,
spero di non essere la sola ad avere questo problema.
La mia applicazione gira in locale ed è costituita da un gruppo di Ocx e da una Dll; le Ocx vengono visualizzate su pagine Asp con l'ausilio di PWS o IIS e gli accessi a MSDE sono tutti concentrati nella Dll.
Quando rilascio una nuova versione creo un Cab internet del gruppo di Ocx, aggiungendo la Dll; il risultato è il file X.Cab e la pagina X.Htm.
Fino a qua tutto bene, creo uno zip autoscompattante e lo rilascio; se scompatto lo Zip e richiamo la pagina X.htm l'installazione va a buon fine a patto che sia aperta una connessione ad internet (in c:\windir\Downloaded Program Files\. mi ritrovo l'Ocx scaricata).
Se scompatto il file Zip e chiamo la pagina X.htm con la connessione chiusa non succede nulla; il PWS sta funzionando correttamente, la pagina la chiamo da http:/localhost/X.htm.
C'è qualcosa che devo sapere a proposito di configurazioni di IE, service pack, directory di installazione?
Grazie.

Valentina Frizzon

Risponde Andrea Chiarelli

Ciao Valentina,
dallo scenario che hai descritto credo di poterti dare qualche suggerimento di una possibile causa del comportamento apparentemente anomalo del download automatico. Nel tuo messaggio non hai indicato l'ambiente di sviluppo che hai utilizzato per sviluppare gli OCX, per cui assumo che abbia utilizzato un componente della famiglia Visual Studio per lo sviluppo e il Package & Deployment Wizard per la creazione del cabinet. In uno dei passi del wizard viene richiesto se il runtime eventualmente necessario per l'esecuzione del controllo deve essere scaricato dal sito Web della Microsoft (opzione predefinita).
Se hai lasciato l'impostazione predefinita, IE cercherà di connettersi al sito della Microsoft anche solo per verificare l'esistenza di una versione aggiornata del runtime. Se non è disponibile una connessione al sito Microsoft il processo di download non può proseguire.
Perché il download possa essere effettuato in locale o in una Intranet, senza quindi tenere attiva una connessione ad Internet, elimina il riferimento al sito Microsoft per l'eventuale runtime nella fase di
creazione del cabinet.
Spero che questa indicazione risolva il problema che hai descritto.

 

 

Problema nell'inserimento di un oggetto in un file RTF

Buongiorno,
le sottopongo un problema di cui ovviamente non ho ancora trovato una risoluzione.
Ho un architettura di tipo documento vista, dove la vista è CrichEditView e desidero con questa visualizzare un file di tipo .rtf e poter in esso inserire varie immagini .bmp.
Per inserire un immagine è fornita la funzione CRichEditView::InsertFileAsObject che però occupa della memoria e non la libera di nuovo fino a quando la vista non viene chiusa. Ho cercato quindi di sostituire questa funzione prendendo un esempio riportato nel Msdn al "ID:Q220844",ma nulla da fare qualunque sia la combinazione che adotto c'è sempre memoria che viene allocata e non disallocata.
Aspettando una risposta.

Daniela Squarise

Risponde Davide Quack

Non uso le MFC da tanto tempo perché sono dell'opinione che il modo più veloce di risolvere i problemi è non averli affatto. Nel suo caso tra MFC, OLE e il più che famigerato controllo rich edit che ci sta sotto, mi meraviglio che non si sia formattato il suo PC.
Anche se risolve in modo ortodosso il suo problema, le rimarrà sempre quello delle versioni di questo controllo. Tenga conto che conosco più di una persona che si installa su win2000 la DLL di sistema con il rich edit di win98 perché la vecchia versione funziona meglio.
Le consiglio di aggirare il problema creando un nuovo controllo static, o una nuova finestra, mettendolo sopra il controllo rich edit, e disegnandoci dentro la sua figura. Dentro il controllo rich edit può metterci un semplice rettangolo nero, appunto come segna posto. Il codice in C/C++.
Prima però di valutare questa strada drastico, vorrei consigliarle di dare un'occhiata agli esempi dell'SDK in C. Spesso la qualità del codice è molto meglio di quella che può trovare sul MSDN.
Saluti