Visualizzazione post con etichetta Tips And Tricks. Mostra tutti i post
Visualizzazione post con etichetta Tips And Tricks. Mostra tutti i post

lunedì 18 dicembre 2017

Windows 10 e Onedrive: come disfarsene

Windows 10 si sa è invasivo, vuole a tutti i costi che l'utente si integri con i vari tool Microsoft tra cui OneDrive, con cui ha un sodalizio difficile da rompere. Così capita che anche quando si è disinstallata l'applicazione di OneDrive, essa continui ad apparire nel menu ad albero di esplora risorse come semplice icona vuota... E' vero, non darebbe fastidio, ma se la si volesse rimuovere?

Ecco una semplice procedura testata su Windows 10 PRO 1709 (Fall Creator Update), ma che dovrebbe andare bene anche su altre versioni e precedenti build.

Aprite il registro di sistema con i provilegi di amministratore (cercate regedit ed eseguitela con il tasto destro cliccando su Esegui come amministratore), poi aprite il sequende percorso:

HKEY_CLASSES_ROOT\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}

Sulla parte destra troverete la chiave System.IsPinnedToNameSpaceTree che ha il valore 1. Mettetela a 0 e chiudete il registry.

Et voilà, OneDrive è scomparso!


martedì 5 aprile 2016

Windows 10: personalizazione desktop a mo di Windows 8

Non riesco a spiegarmi perché Microsoft vuol rendere la vita dell'utente Windows 10 difficile a tutti i costi, tarpando le ali alla personalizzazione anche per le cose più semplici.
Un esempio?
Provate a mettere lo sfondo bianco del desktop con un'immagine centrata.

Fortunatamente è disponibile un trick per fare ciò.

Accedete al menu Esegui cliccando sul tasto WIN+R
Poi scrivete questa stringa:

control /name Microsoft.Personalization /page pageWallpaper

Et voilà, il vecchio menu di personalizzazione del desktop è di nuovo disponibile!

martedì 29 marzo 2016

Windows 10 activation by phone

Windows 10 wants to live connected to the internet, it's clear. But there are some situations where it is not possible or it is mandatory forbidden.
In these cases you have to use the procedure to activate the Windows copy by phone. But how?
The activation menu, in fact, doesn't show clearly this possibility, but a workaround exists.

  • Log in using an administrative account
  • Type "SLUI 04" in the search box of the menu
  • Select and run the application you find

A renewed "Activation by phone" mask should appear and by following the wizard you should able to activate your authentic copy of the OS follow the step by step procedure by phone.

Credits: http://windows.microsoft.com/it-it/windows-10/activation-errors-windows-10

martedì 15 marzo 2016

How to retrieve Win product key from uefi using the command prompt

From many years, pc manufacturers don't use the label of Windows Product key anymore. This because UEFI bios has the possibility to store and protect that key. This is a really limitation for an user who wants to restore the pc without having the recovery cd created soon after the first setup. To partially overcome this problem, Microsoft gives you the possibility to retrieve the product key using the command prompt. Here, the way to get it: 1) run the command prompt with administrative privileges 2) type the command:
wmic path SoftwareLicensingService get OA3xOriginalProductKey

giovedì 6 agosto 2015

Visual studio setup projects: how to use the same custom dialog box more than one time

Making a setup project using Visual Studio, 2005 version in my case, is fast and easy and it is my favorite tool for old projects. A customization of the installation workflow is easy using custom action and custom dialog box. The problem raises when you need 2 or more dialog box of the same type: dialog box with options, in example. If you don't want to code your own dialog box and your own setup project, you can easily bypass such limitation with a little tip that I'm going to show.
A "Dialog box" derives from a template stored inside the main Visual Studio installation folder, usually
%ROOT%:\%PROGRAM FILES%\Microsoft Visual Studio 8\Common7\Tools\Deployment\VsdDialogs
. This folder includes several subfolders, one generic and one for each of the supported languages. In example the subfolder called 1033 stores the templates for the English language. The goal is to find the template we need to use more then one time. In this example I'm going to modify the "2 options dialog" where its templates is called "VsdCustom2ButtonDlg.wid". Make a copy of this file calling it "VsdCustom2ButtonDlg_2.wid" and open it with ORCA. Because Visual studio check the presence of equal templates when you build a setup project, you have to keep the characteristics of the dialog, to have 2 option buttons in our example, renaming all the occurrences of the previous name. Open the file in ORCA and select the table Module Dialog. Change the name from Custom2Buttons to Custom2Buttons_2. Now iterate for each table and when you find the old name Custom2Buttons, change it with the new one. You have to generate also a new GUID for the field ModuleId of the table Module signature At the end, you can save it. Now your duplicated "2 options dialog" is ready to use and you can choose it in the "Add Dialog" menu of the "User Interface" sction of your setup project.
I suggest to make the first copy of the dialog in the subfolder 0 that it is the generic one and to copy it for each of languages supported, in example 1033, 1045 etc. etc. The only field that you have to change when you copy your wid file from the subfolder  0 to another one is the field Language of the table Module Signature that it has to be changed according to the specific language. So, if you are porting your new dialog template from the default folder 0 to the English folder 1033, Language field has to be 1033.
That's all!

domenica 29 marzo 2015

MFC: CPropertySheet e WM_CLOSE


Se vi siete imbattuti nella spiacevole situazione di dover intercettare il click sul pulsante di chiusura del menu di sistema di una PropertySheet (la classica X, per intenderci che si trova sulla barra del titolo) vi sarete accorti che questo evento non viene notificato usando il classico messaggio:

WM_CLOSE()
Un semplice escamotage per ottenere lo stesso identico risultato è quello di sfruttare i messaggi notificati tramite
WM_SYSCOMMAND
. Il parametro nID, infatti, assume il valore della costante
SC_CLOSE
proprio quando l'utente sta per chiudere la finestra. Per gestire la cosa ed eventualmente impedire la chiusura della finestra basterà scrivere una propria funzione che valuti se ci sono i presupposti per chiudere senza danni (ad esempio ci sono cose da salvare) e poi intercettare il giusto nID del messaggio
WM_SYSCOMMAND
. Ecco un piccolo esempio:

void CMyPropSheet::OnSysCommand(UINT nID, LPARAM lParam) 
{
 if (nID == SC_CLOSE)
 {
       OnClose();
 }
 else
 {
      CPropertySheet::OnSysCommand(nID, lParam);
 }
}

void CMyPropSheet::OnClose()
{
 if (!CanIClose())
      AfxMessageBox(_T("You cannot close me because.........."));
 else
      CPropertySheet::OnClose();
}

martedì 21 ottobre 2014

BCGControlBarPro e Visual Studio 2013: xp support

Per mantenere la compatibilità su Windows Xp di un'applicazione generata utilizzando il Visual C++ e la piattaforma Visual Studio 2013 è necessario cambiare il valore Platform ToolSet della soluzione che si sta compilando aprendo le proprietà del progetto -> Tutte le configurazioni -> Platform ToolsSet = Visual Studio 2013 - Windows XP (v120_xp).

Chi si avvale di librerie grafiche esterne, come la ottima BCGControlBar Pro dovrà effettuare la stessa modifica pena ritrovarsi con un errore di questo tipo: The procedure entry point InitializeCriticalSectionEx could not be located in the dynamic link library KERNEL32.dll.



Questo accade perché, per default, i progetti delle librerie BCGControlBarPro hanno impostato il Platform ToolsSet = Visual Studio 2013, ovvero, senza compatibilità per Xp.

Per cambiare questo comportamento andate nella directory relativa alla libreria, generalmente C:\Program Files (x86)\BCGSoft\BCGControlBarPro\BCGCBPro e, tramite VS2013, aprite le Solutions chiamate: BCGCBPro120.sln e BCGCBProStatic120.sln. Selezionate Tutte le configurazioni e cambiate il parametro Platform ToolsSet in Visual Studio 2013 - Windows XP (v120_xp).
Fatto ciò dovrete ricompilare il tutto.


giovedì 18 aprile 2013

Lo strano caso della parola chiave const in C++

L'uso più scontato ed inflazionato della parola chiave const in C++ è sicuramente quello che vede coinvolte le costanti, in sostituzione della dichiarazione C-Like che prevede l'uso di una #define

Esempio:

// Dichiarazione C:
#define MIA_COSTANTE_NUMERICA 5;

//Dichiarazione C++
const int MIA_COSTANTE_NUMERICA = 5;

In questo caso la variabile  MIA_COSTANTE_NUMERICA, come il nome suggerisce, assume un valore iniziale che non può essere più cambiato all'interno del programma.


La parola chiave const, però, legata sempre al concetto di costante, può essere posta, nell'uso con variabili puntatore, anche in altre posizioni assumendo un significato diverso e permettendo utilizzi diversi alla variabile a cui è associata.
Vediamo un breve listato di codice che illustra i possibili usi ed abusi con i relativi messaggi di errore. (il compilatore usato è quello Microsoft).
int _tmain(int argc, _TCHAR* argv[])
{
 int var = 1;

 int var2 = 2;

 const int MIA_VAR_COSTANTE = 7;

 MIA_VAR_COSTANTE = 5; // Errore C3892

 // puntatore ad una costante numerica
 const int* ptrConstVar = &var;

 std::cout << *ptrConstVar << std::endl;

 *ptrConstVar = 5; // Errore C3892

// lecito, perché si cambia la locazione a cui si punta, ma non il valore
 ptrConstVar = &var2; 

 std::cout << *ptrConstVar << std::endl;

 // puntatore costante ad una variabile numerica 
 int* const constPtrVar = &var;

 constPtrVar = &var2; // Errore C3892 

 std::cout << *constPtrVar << std::endl;

 /* il puntatore alla locazione di memoria ora non viene cambiato, 
  ma ne possiamo cambiare il contenuto cambiando, di conseguenza, 
 anche il valore della variabile var. */
 *constPtrVar = 3;

 std::cout << *constPtrVar << "ed ora var = " << var << std::endl;

// puntatore costante ad una costante numerica
 const int* const ConstPtrConstVar = &var;

 *ConstPtrConstVar = 3; // Errore C3892 

 ConstPtrConstVar = &var2; // Errore C3892 

 return 0;
}

lunedì 11 marzo 2013

Errore MSB3073 Visual Studio 2012

Se provando a compilare un progetto con visual Studio 2012 (testato su versione Express) ottenete un errore del tipo: error MSB3073 

<<

Errore    2    error MSB3073: uscita dal comando "Win32\output\debug\....

>>


molto probabilmente state provando a compilare un progetto residente in una directory su cui l'utente non ha diritti di scrittura/modifica.

Per sbloccare la situazione basterà assegnare i giusti permessi di scrittura, oppure spostare il progetto in una directory con meno restrizioni. 
Per assegnare i diritti di scrittura, selezionare la cartella con il tasto destro del mouse, cliccare su proprietà, poi Sicurezza ed infine sul pulsante "Modifica". Lì spuntare la casella "controllo completo" per il gruppo Users e cliccare su Applica.

 

martedì 29 gennaio 2013

Intercettare il codice di uscita di un processo lanciato dal prompt dei comandi

Questo brevissimo trick mostra come poter ricavare il codice di uscita di un processo lanciato mediante il command prompt.
Windows memorizza l'exit code nella variabile di ambiente ErrorLevel, quindi per ottenere questo codice basterà leggerla.
Esempio:

Ipotizzo di lanciare un processo con un parametro passato da linea di comando
mioprocess.exe -s

Alla sua chiusura, il comando

echo %errorLevel%

stamperà a video il codice di uscita.


venerdì 19 ottobre 2012

IExpress: eseguire file bat su Windows 64 bit bugfix

Microsoft fornisce gratuitamente un'utility, chiamata IExpress, che consente di creare pacchetti di files compressi autoestraenti.IExpress offre inoltre la possibilità di eseguire delle azioni, come lanciare un processo ad esempio, automaticamente al termine dell'estrazione


Maggior informazioni sull'utility IExpress possono essere trovate direttamente sul sito della Microsoft ai seguenti indirizzi TechNet e KB, oppure googlando nel web.

Sfruttando questa utility in un progetto mi sono imbattuto in bug mentre tentavo di far eseguire un piccolo script bat su una macchina con Windows 7 64bit.
Al termine della procedura automatica di estrazione del pacchetto, al momento di lanciare il bat, appare il messaggio: "Errore durante la creazione del processo < Command.com /C", come meglio esplicitato dalla seguente immagine.



Questo succede perché IEXpress tenta di eseguire lo script bat invocando la vecchia utility a 16bit Command.com che non è più presente sui sistemi a 64 bit.

Per ovviare al bug dobbiamo forzare noi la chiamata all'utility 32bit CMD.exe.
Per fare questo, durante il setup guidato dell'utility IExpress, anziché chiamare direttamente il file bat, dobbiamo anteporre la chiamata al processo cmd con parametro /c, come mostrato in figura



mercoledì 4 luglio 2012

Windows Xp e sospensione

Non tutti sanno che anche in Windows Xp è possibile abiliatre la modalità sospensione che permette, risparmiando energia e batteria, di avere un boot in molti dei casi più veloce con già precaricata l'ultima sessione di lavoro.
 Praticamente la modalità di sospensione differisce dallo stand-by perché non lascia acceso il computer, ma lo spegne salvando, però, tutto la sessione in un singolo file (hiberfil.sys) che verrà ricaricato poi al riavvio.

Di default questa possibilità è disabilitata.
Ecco alcuni semplici passaggi per attivarla.

  1. Abilitare la funzionalità da pannello di controllo
    • Pannello di Controllo 
      •  Opzioni Risparmio Energia 
        • Sospensione -> Attiva Sospensione
  2. Abilitare il pulsante  Sospendi nel menu di "Spegni computer" mediante la creazione di un'apposita chiave di registro:
    • Fare clic su Start, scegliere Esegui, digitare regedit e quindi fare clic su OK.
    • Individuare e quindi fare clic sulla seguente sottochiave del Registro di sistema: HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows
    •  Pulsante destro del mouse su Windows, scegliere Nuovo, quindi Chiave.
    • Nella casella Nuova chiave # 1, digita System, quindi premere INVIO.
    • Pulsante destro del mouse su sistema, scegliere Nuovo, quindi Chiave.
    • Nella casella Nuova chiave # 1 scatola, digita Shutdown e quindi premere INVIO.
    • Dal menu Modifica, scegliere Nuovo, quindi Valore DWORD.
    • Nel Nuovo valore # 1 box, digita ShowHibernateButton e premere INVIO.
    • Pulsante destro del mouse su ShowHibernateButton, e quindi fare clic su Modifica.
    • Nella casella Dati valore digitare 1, lasciare l'opzione Esadecimale predefinita selezionata e quindi fare clic su OK.
    • Chiudere l'editor del Registro di sistema.
 A questo indirizzo potete trovare l'articolo di riferimento Microsoft in inglese, in cui viene spiegata la procedura anche per gli utenti di un dominio.

Se da un lato non si consuma la batteria, dall'altro si andrà ad occupare una porzione di hdd nella partizione primaria. Occhio quindi allo spazio disponibile prima di abilitare questa modalità! 

venerdì 20 gennaio 2012

Microsoft SDK v7 su Visual Studio 2005: errore registrando la variabili di ambiente

Scneario: installazione Microsoft SDK versione 7 su Visual studio 2005 e registrazione delle variabili di ambiente per il compilatore utilizzando il Windows SDK Configurator Tool su Windows Xp italiano.
Errore: your system does not have Visual Studio 2005 or Visual Studio 2008 installed.

Soluzione: modificare temporaneamente, nelle opzioni internazionali e della lingua la voce standard e formati impostandola come "Inglese (Stati uniti)".
Ora potete effettuare la registrazione utilizzando il tool automatico.
Il problema sembra sia dovuto ad un bug nel tool che non è in grado di parsare correttamente il file alla ricerca della versione di visual studio installata.

giovedì 19 gennaio 2012

Disabilitare l'Autoplay di Windows

Una funzione scomoda, invasiva e fautrice di azioni sospette è sicuramente la funzione di Autoplay di Windows che, all'inserimento di un CD o di una penna USB, ne scansiona immediamente il contenuto lanciando un eventuale eseguibile di default residente su quel supporto.

Con questo trick è possibile disabilitare questa funzione seguendo pochi semplici passi:

  1. Cliccare Start -> Esegui
  2. Digitare gpedit.msc
  3. Nella finestra che appare cliccare su Criteri di proezione locali -> Modelli Amministrativi -> Sistema  (vedi foto 1)
  4. Nel menu di destra cliccare sulla voce "Disattiva riproduzione automatica"
  5. Selezionare attiva e abilitare su tutte le unità (vedi foto 2)
  6. Cliccare su Applica, quindi chiudere il tutto. 

mercoledì 23 novembre 2011

Nuova vita per il Pirelli Age

Ecco alcuni semplici passi per ridare una nuova vita ai vecchi router Pirelli Age, un tempo dati da Telecomitalia per i contratti di fascia business.
Esso era generalmente bloccato da Telecom grazie ad un firmware customizzato perciò, in questa modalità, è difficilmente utilizzabile in altri ambiti.

Il modem si presenta così:






Il nostro scopo è quello di cambiare il firmware a bordo con uno open e più ricco di funzionalità.
Per prima cosa è necessario aprirlo svitando le 2 viti a croce che si trovano proprio sul lato aperto, dove, per intenderci, sono presenti gli attacchi adsl e lan.



Il secondo step è la costruzione del cavetto necessario a collegare i pin evidenziati dal quadrato rosso al pc che deve essere di tipo USB A.
Per fare questo io ho cannibbalizzato una prolunga USB maschio-femmina alla quale ho saldato dei fili per ottenere una cosa tipo questa







Scusate la non perfezione delle saldature ma l'ho fatte con una punta enorme e non assolutamente adatta a questi scopi.
Potete trovare lo schema di connessione di un cavo USB direttamente su wikipedia. Io non avevo a disposizione i colori standard quindi ho utilizzato fili diversi.
Nel caso illustrato in foto il rosso è il VBUS (pin 1) , il giallo D- (pin 2), celeste D+ (pin 3) e nero  GND (pin 4).

Lato router, invece questa è la connessione che deve essere fatta:


I primi due pin, rosso e giallo hanno una connessione 1:1, mentre gli ultimi 2, D+ e massa sono invertiti, quindi:


cavo usb      board Modem
1                1
2                2
3                4
4                3

I pin 5 e 6 della board, invece vanno ponticellati per abilitare la sovrascrittura della flash.

Ecco la panoramica del lavoro finale

         

Ora che la parte hardware è pronta ci serve la parte software che può essere scaricata qui sul sito della Origo Software.
Scaricate l'ultima versione della ISO e masterizzatela con il vostro programma preferito.
All'interno del cd c'è un pdf che vi guiderà passo passo all'aggiornamento del firmware con illustrata tutta la procedura. Una copia online è disponibile a questo indirizzo.
Il cd è bootabile e quindi partirà all'accensione del pc. Fatelo dopo aver collegato il modem usb al vostro pc e il trasformatore alla presa di corrente. State attenti alla versione di pc che utilizzate perché i nuovi potrebbero avere dei problemi. Io ho dovuto riesumare un vecchio pc perché i cd-rom sata non vengono riconosciuti da RepairCd in quanto basato su una versione di Windows 98.
Dopo aver provato diversi firmware io ho optato per quello made by Origo, chiamato 4.1.0.9.F-3.2.1_021804. 
Finita la procedura il router avrà un indirizzo del tipo 10.0.0.2 e l'account di amministrazione sarà admin con password epicrouter. La chicca finale è che le porte lan, un tempo pilotate a 10Mbit, ora vanno a 100!!

Buon hacking a tutti!

domenica 9 ottobre 2011

Conoscere la versione del kernel che si sta usando

Spesso e volentieri, magari durante il download di applicazioni per linux ci viene richiesto di conoscere quale versione del kernel linux stiamo usando.
Per soddisfare questa richiesta ci viene incontro il comando uname che può essere accompagnato da diverse opzioni.
Le opzioni base per conoscere ciò di cui abbiamo bisogno sono 'r' e 'm' quindi: uname -rm, da shell di comando, restituirà il seguente output (nel mio specifico caso):

2.6.32-32-generic  x86_64

Ovvero la release del sistema operativo (kernel) ed il tipo di piattaforma, nel nostro caso 64 bit.

Nota: il man ci sconsiglia l'uso dell'opzione 'm', suggerendoci la 'p'. Nel mio sistema Ubuntu Lucid, sul quale ho effettuato il test, utilizzando la p mi viene restituito unknown

giovedì 29 settembre 2011

Win32 C++: sapere se un'istanza del programma è già caricata

Breve esempio di una possibile soluzione al problema della ricerca di un'istanza del programma già attiva.
Il codice si basa sulla creazione di un semaforo ed il relativo check della sua esistenza al caricamento dell'applicazione. L'API Win32 in gioco è la CreateSemaphore.

Routine da chiamare nel main o nell' InitHistance della vostra applicazione:

bool AmIAlreadyActive()
{
TCHAR* szSemName = _T("MySemaphoreApp"); // utilizzare il nome che più aggrada
MyHandle=  CreateSemaphore(NULL, 0, 1, szSemName);

return (!MyHandle || (GetLastError() == ERROR_ALREADY_EXISTS)) ? true : false; 
}
MyHandle è una variabile di tipo HANDLE.
Ricordarsi di chiude l'handle al termine del programma mediante
CloseHandle(MyHandle);

martedì 27 settembre 2011

Visual basic 6: lanciare un processo esterno con CreateProcess


Breve snippet di codice per aprire un processo esterno ed aspettare che finisca il lavoro in Visual Basic 6 utilizzando l'API CreateProcess e WaitForSingleObject

Private Type STARTUPINFO
        cb As Long
        lpReserved As String
        lpDesktop As String
        lpTitle As String
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Long
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
End Type

Private Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadId As Long
End Type

Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, byVal lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const NORMAL_PRIORITY_CLASS = &H20
dwMilliseconds As Long) As Long
Private Const INFINITE = &HFFFF      '  Timeout infinito
Private Const STARTF_USESHOWWINDOW = &H1

Private Const SW_SHOW = 5

Private Sub LaunchAndWait(ByVal ppath As String, ByVal cmdLine, ByVal swWnd As Long)
On Error GoTo errLW
Dim p As Long
Dim workDir As String
Dim SI As STARTUPINFO
Dim PI As PROCESS_INFORMATION

workDir = Left$(ppath, Len(ppath) - (Len(ppath) - InStrRev(ppath, "\")))

SI.cb = Len(SI)
SI.dwFlags = STARTF_USESHOWWINDOW
SI.wShowWindow = swWnd

If Len(cmdLine) > 0 Then
    If Left$(cmdLine, 1) <> " " Then
        cmdLine = " " & cmdLine
    End If
    Debug.Print ppath & cmdLine
    p = CreateProcess(ppath, cmdLine, 0&, 0&, 0&, NORMAL_PRIORITY_CLASS, 0&, workDir, SI, PI)
Else
    Debug.Print ppath
    p = CreateProcess(vbNullString, ppath$, 0&, 0&, 0&, NORMAL_PRIORITY_CLASS, 0&, workDir, SI, PI)
End If

If p <> 0 Then
    WaitForSingleObject PI.hProcess, INFINITE
    CloseHandle PI.hProcess
    CloseHandle PI.hThread
Else
    MsgBox "Error LaunchAndWait code = " & GetLastError()
End If

Exit Sub
errLW:
Debug.Print Err.Description
End Sub

sabato 24 settembre 2011

Windows Installer Resiliency: disabilitarla per alcuni files


Lavorando sulla creazione di pacchetti di installazione per i mie progetti mi sono scontrato con una caratteristica importante, ma nello stesso fastidiosa di Windows Installer, meglio conosciuta come resiliency.
Essa è un meccanismo di autoriparazione del servizio Windows Installer che sorveglia i files del vostro programma e li ripristina nel caso qualcuno fosse stato cancellato per errore.
Detta così potrebbe sembrare una buona cosa, ma spesso può intralciare il lavoro del programmatore, specialmente in tutti quei casi dove è il programma stesso a dover cambiare nome o cancellare i files installati con il pacchetto.
L'escamotage che Microsoft ci propone per bypassare il meccanismo è quello di disabilitare il componente WI nel caso in cui esso ostacoli il nostro volere.
Non mi sembra però una buona soluzione, soprattutto per i grandi effetti collaterali, quindi è più opportuno inibire il controllo sui files per i quali vogliamo avere la massima libertà di operare.
Il meccanismo della resiliency si basa sul valore della chiave KeyPath di ogni componente del pacchetto e che rappresenta il collegamento logico fra esso ed il file fisico. Rendendolo nullo, quindi, avremo la possibilità di escludere il check sullo specifico componente.
Per fare ciò sarà sufficiente aprire il pacchetto MSI precedentemente creato con il vostro ambiente preferito con ORCA e osservare il contenuto di due tabelle, principalmente: Component e File.
Nella tabella Component trovate il campo KeyPath, ma l'intero contenuto risulata illegibile a causa degli identificativi numerici usati. Per avere l'esatta corrispondenza fra il valore di KeyPath ed il nome del file dobbiamo avvalerci della tab File, come evidenziato nelle due immagini di seguito


Cancellare il valore di KeyPath nei componenti per i quali non desideriamo l'autorepair ci consentirà di liberarli dall'occhio vigile di Windows Installer

martedì 9 agosto 2011

SubVersion: abilitare la modifica dei commenti dopo il commit

Se dopo aver eseguito un commit provate a modificare le proprietà della revisione appena salvata, il vostro client subversion vi restituirà l'errore di operazione non abilitata, indicando di contattare l'amministratore del repository e citando la proprietà pre-revprop-change.
Per default, infatti, non è possibile modificare un commento ad una revisione a posteriori, cioè una volta eseguito il commit della revisione stessa, perché subversion non gestisce il versioning dei commenti ad una revisione. Ogni modifica del commento, quindi, andrà a sovrascrivere quella precedente con il rischio di perdere informazioni.
Se però non avete di questi timori, oppure semplicemente vi siete dimenticati di inserire degli importanti commenti a questa revisione potete abilitare questa possibilità in modo temporaneo o definitivo utilizzando uno degli "Hooks Scripts" che lo stesso subversion vi mette a disposizione.
Gli hook si trovano all'interno della el vostro repository, in una cartella chiamata proprio hooks.
Per una descrizione dettagliata egli hooks disponibili vi rimando alla documentazione ufficiale, reperibile qui.
L'hook che ci interessa si chiama pre-revprop-change.tmpl e per abiliatrlo non dobbiamo fare altro che rinominarlo togliendo l'estensione tmpl e renderlo eseguibile, quindi:



sudo cp pre-revprop-change.tmpl pre-revprop-change
sudo chmod ug+x pre-revprop-change


Ora avete abilitato le modifiche sui commenti anche dopo il commit.