Sono disponibili due progetti: uno con un ingente numero di file C++, l'altro rappresentato da una DLL scritta in C.We have two projects, one with a large number of C++ files, and another a DLL that's written in C.

#define WINVER 0x0500 // these defines are set so that we get the
#define _WIN32_WINNT 0x0500 // maximum set of message/flag definitions,
#define _WIN32_IE 0x0400 // from both winuser.h and commctrl.h.

WINVER verrà impostato su Windows 7.WINVER we will set to Windows 7.È più semplice leggere il codice in un secondo momento se si usa la macro per Windows 7 (_WIN32_WINNT_WIN7), anziché il valore stesso (0x0601).It’s easier to read the code later if you use the macro for Windows 7 (_WIN32_WINNT_WIN7), rather than the value itself (0x0601).

Il punto di ingresso per una DLL non deve essere esportato.The entry point for a DLL should not be exported.Il punto di ingresso è destinato solo a essere chiamato dal caricatore quando la DLL viene caricata inizialmente in memoria, quindi non deve trovarsi nella tabella di esportazione, che è pertinente ad altri chiamanti.The entry point is only intended to be called by the loader when the DLL is first loaded into memory, so it should not be in the export table, which is for other callers.È necessario assicurarsi che la direttiva __declspec(dllexport) non sia collegata.We just need to make sure it does not have the __declspec(dllexport) directive attached to it.In spyxxhk.c, è necessario rimuoverlo da due posizioni: la dichiarazione e la definizione di DLLEntryPoint.In spyxxhk.c, we have to remove it from two places, the declaration and definition of DLLEntryPoint.Non è mai stato consigliabile usare questa direttiva, ma le versioni precedenti del linker e del compilatore non la contrassegnavano come problema.It never made sense to use this directive, but previous versions of the linker and compiler did not flag it as problem.Le versioni più recenti del linker inviano un avviso.The newer versions of the linker give a warning.

Ci sono talmente tante definizioni di operatore >> che questo tipo di errore può incutere timore.There are so many operator << definitions that this kind of error can be intimidating.Dopo un'osservazione più attenta degli overload disponibili, è possibile dedurre che molti di essi sono irrilevanti ed esaminando più da vicino la definizione di classe mstream è stata identificata la funzione seguente, che dovrebbe essere chiamata in questo caso.After looking more closely at the available overloads, we can see that most of them are irrelevant, and looking more closely at the mstream class definition, we identified the following function that we think should be called in this case.

A questo punto, è possibile compilare il progetto.At this point, we are able to compile the project.Tuttavia, occorre gestire alcuni avvisi e componenti facoltativi dell'aggiornamento, ad esempio la conversione da MBCS a Unicode o il miglioramento della sicurezza usando le funzioni CRT sicure.There are a few warnings to work through, however, and there are optional parts of the upgrade, such as converting from MBCS to Unicode or improving security by using the Secure CRT functions.

Sono dunque rimaste solo alcune situazioni in cui le variabili interne veniva usate direttamente.That left only a few places where the internal variables were used directly.Dal momento che tali variabili sono state rimosse, si sono verificati alcuni errore che devono essere gestiti in modo esplicito.Since we removed those variables, we get a few errors that have to deal with explicitly.

Questa funzione particolare, wsprintf, viene effettivamente definita nelle intestazioni di Windows e la relativa documentazione consiglia di non usarla, a causa del possibile sovraccarico del buffer.This particular function, wsprintf, is actually defined in the Windows headers, and the documentation for it recommends that it not be used, due to possible buffer overrun.Non è specificata una dimensione per il buffer szTmp, quindi non esiste alcun modo per la funzione di verificare che il buffer possa contenere tutti i dati da scrivere.No size is given for the szTmp buffer, so there is no way for the function to check that the buffer can hold all the data to be written to it.Vedere la sezione successiva sul porting alle funzioni CRT sicure, in cui è possibile risolvere altri problemi simili.See the next section about porting to the Secure CRT, in which we fix other similar problems.Alla fine è stata sostituita da _stprintf_s.We ended up replacing it with _stprintf_s.

Come verifica del lavoro, è necessario reimpostare il set di caratteri in modo da usare il set di caratteri multibyte e assicurarsi che il codice venga compilato usando MBCS oltre a Unicode.As a check on our work, we should reset the Character Set to Use Multibyte Character Set and make sure that the code still compiles using MBCS as well as Unicode.Inutile a dirsi, è necessario eseguire un test completo sull'app ricompilata dopo tutte queste modifiche.Needless to say, a full test pass should be executed on the recompiled app after all these changes.

Nel lavoro effettuato con questa soluzione Spy++, uno sviluppatore di C++ medio ha impiegato due giorni lavorativi per convertire il codice in Unicode,In our work with this Spy++ solution, it took about two working days for an average C++ developer to convert the code to Unicode.esclusi i tempi di riesecuzione del test.That did not include the retesting time.

Visual C++ offre uno stratagemma per semplificare l'ottenimento del codice protetto senza aggiungere altrettanti parametri delle dimensioni, che consiste nell'usare gli overload dei modelli.Visual C++ provides a trick to make it easier to get code secure without adding as many size parameters, and that is by using the template overloads.Dal momento che questi overload sono modelli, sono disponibili solo durante la compilazione come C++, non come C. Spyxxhk è un progetto in C, quindi lo stratagemma non funzionerà a tale scopo,Since these overloads are templates, they are only available when compiling as C++, not as C. Spyxxhk is a C project, so the trick won't work for that.tuttavia è possibile usarlo in Spyxx, che non è un progetto in C.However, Spyxx is not and we can use the trick.Lo stratagemma consiste nell'aggiungere una riga simile a questa in una posizione tale da consentirne la compilazione in ogni file del progetto, ad esempio in stdafx.h:The trick is to add a line like this in a place where it will be compiled in every file of the project, such as in stdafx.h: