My blog has moved!

You should be automatically redirected in 6 seconds. If not, visit
http://kavachai.com
and update your bookmarks.

Thursday, October 22, 2009

Updating Application That Has Custom Actions in Setup.dll

Recently I was creating installer for application that is suppose to be updated regulary. Also cab installer for this application used setup.dll to perform custom actions during install/uninstall.

Since cab installer doesn't have "update" feature installing update is done as a sequence: uninstall_old > install_new. Calls to setup.dll will be as follows:
  1. Install_Init() from new setup.dll is called with fFirstCall=true and fPreviouslyInstalled=true.
  2. Old installation is removed. This leads to calls to Uninstall_Init() and Uninstall_Exist() from old setup.dll (which is stored in \windows\AppMgr).
  3. Install_Init() from new setup dll is called with fFirstCall=false and fPreviouslyInstalled=false.
  4. New files are extracted by cab installer.
  5. Install_Exist() is called.
To control updating process I needed to use some kind of a marker that will be available at all of those steps.
Originally I tried to use named Mutex (mainly because it is an in-memory object), but for some reason it didn't work as expected. So I considered key in registry and a file. Creating/removing file just to use it as a marker is not very good idea and my final solution was to use a key in registry:
#include <windows.h> 
#include <string.h>

///////////////////////////////////////////////////////////
// Methods to work with marker.

void SetInstallingStartFlag() {
HKEY hKey = NULL;
DWORD dwDisposition;
if (::RegCreateKeyEx(HKEY_CURRENT_USER, _T("\\SOFTWARE\\MySoftwareInstall"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) {
::RegCloseKey(hKey);
}
}
void RemoveInstallingStartFlag() {
HKEY hKey = NULL;
if (::RegOpenKeyEx(HKEY_CURRENT_USER, _T(""), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) {
::RegDeleteKey(hKey, _T("\\SOFTWARE\\MySoftwareInstall"));
::RegCloseKey(hKey);
}
}
BOOL OpenFlagKey() {
BOOL bOpened = FALSE;

HKEY hKey = NULL;
if (::RegOpenKeyEx(HKEY_CURRENT_USER, _T("\\SOFTWARE\\MySoftwareInstall"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
bOpened = TRUE;
::RegCloseKey(hKey);
}

return bOpened;
}
BOOL IsRemovingDuringUpdate() {
return OpenFlagKey();
}
BOOL IsInstallingDuringUpdate() {
return (OpenFlagKey() == FALSE);
}


///////////////////////////////////////////////////////////
// Setup.dll interface methods and enums.

typedef enum {
codeINSTALL_INIT_CONTINUE = 0,
codeINSTALL_INIT_CANCEL
}
codeINSTALL_INIT;

typedef enum {
codeINSTALL_EXIT_DONE = 0,
codeINSTALL_EXIT_UNINSTALL
}
codeINSTALL_EXIT;

typedef enum {
codeUNINSTALL_INIT_CONTINUE = 0,
codeUNINSTALL_INIT_CANCEL
}
codeUNINSTALL_INIT;
typedef enum {
codeUNINSTALL_EXIT_DONE = 0
}
codeUNINSTALL_EXIT;

extern "C" __declspec(dllexport) codeINSTALL_INIT Install_Init(HWND hwndParent, BOOL fFirstCall, BOOL fPreviouslyInstalled, LPCTSTR pszInstallDir) {
if (fFirstCall == TRUE) {
SetInstallingStartFlag();
}

return codeINSTALL_INIT_CONTINUE;
}

extern "C" __declspec(dllexport) codeINSTALL_EXIT Install_Exit(HWND hwndParent, LPCTSTR pszInstallDir, WORD cFailedDirs, WORD cFailedFiles, WORD cFailedRegKeys, WORD cFailedRegVals, WORD cFailedShortcuts) {
BOOL bUpdating = IsInstallingDuringUpdate();
RemoveInstallingStartFlag();

if (bUpdating == TRUE) {
// Run updating code here...
}
else {
// Run installation code here...
}

return codeINSTALL_INIT_CONTINUE;
}

extern "C" __declspec(dllexport) codeUNINSTALL_INIT Uninstall_Init(HWND hwndParent, LPCTSTR pszInstallDir) {
BOOL bUpdating = IsRemovingDuringUpdate();
RemoveInstallingStartFlag();
if (bUpdating == FALSE) {
// Run uninstallation code here...
}

return codeUNINSTALL_INIT_CONTINUE;
}

extern "C" __declspec(dllexport) codeUNINSTALL_EXIT Uninstall_Exit(HWND hwndParent) {
return codeUNINSTALL_EXIT_DONE;
}

Tuesday, October 20, 2009

Linkpool: TortoiseSVN and Password to SVN

TortoiseSVN does not allow save password to SVN. This forces entering it many times during the day. Fortunately there is a workaround and Ditching the Password Prompts in TortoiseSVN explains how.

Thursday, October 15, 2009

What is MaxBuild Property in .inf File for Cabwiz is Actually For

When installing cab file on devices that have square screens or support screen rotation (last is applicable to all devices starting from WM 2003 SE) you may receive an error message:
The program you have installed may not dispay properly because it was designed for a previous version of Windows Mobile software.
Text of this message is not really correct because actually cab installer complains about screen on WM, not OS version.
To omit this error MaxBuild property declared in Vestion section of .inf file can be used. According to Microsoft:
The BuildMax value can be used to indicate that the application supports square screens (BuildMax=0xA0000000), screen rotation (BuildMax=0xC0000000), or both (BuildMax=0xE0000000).
This is one of those odd things that we can found in sometimes. Error message leads us to wrong direction and name of property doesn't have any connection to what it does :)

Wednesday, October 14, 2009

Hard Reset HTC S730

Yesterday HTC S730 that I use for development hang and after soft reset I couldn't start it again.
So I had to perform hard reset using special key combination: holding both soft buttons press power button. At first it didn't work. After spending couple of minutes on Internet I found that there is a trick: power button must be pressed only for a second and then released.
After very first try I successfully reset the phone :)

Tuesday, October 6, 2009

Linkpool: UI design

Today I watched a video of Ryan Singer from 37sygnals that I want to share about:
  • UI Fundamentals for Programmers: great presentation about UI fundamentals that covers such aspects of UI design as thinking about model, actions and differentiation of information instead of sets of fields and forms.
  • This video reminded me another Ryan's presentation at FOWD. I would recommend watch the first one and then first 5 min from FOWD video plus last 15 min (starting at 34th min).

Friday, October 2, 2009

Hiding Applications to Tray

Last week I found great utility called TrayIt! that allows to hide applications to tray when instead of minimizing to taskbar.
It has very simple interface and works stable. I use it to hide Outlook Express and Lotus Notes.

P.S.
There is also utitlity specially for OutlookExpress (HideOI).

Race to Market Challenge



Commercial of Microsoft's analog of AppStore.

Zen Image for Developers

Thursday, October 1, 2009

Remote Controller for Windows Mobile Devices

Couple of years ago when I was developing for Windows Mobile devices I used Pocket Controller as remote controller. It costs money but we had licenses for it.
Recently I joined Excitor company as WM client developer and had to find freeware alternative to Pocket Controller. I found great application EveryWAN Remote Support. It has free personal edition with the only limitation: device has to be connected to desktop via ActiveSync using USB or Bluetooth. It's OK for development purposes, so EveryWAN Remote Support Personal Edition is a great replacement of Pocket Controller.

Saturday, September 26, 2009

Disabling MSN in Outlook Express

When Outlook Express starts it automatically starts MSN. But there is a way to stop this behavior:
  1. Start Registry Edit (Click Start, then Run, type in 'regedit' and click OK).
  2. Go to HKEY_LOCAL_MACHINE > Software > Microsoft > Outlook Express .
  3. Create new DWORD value with name "Hide Messenger" and set value to 2.
Now you just need to stop MSN, and restart Outlook Express. You will see that MSN Messenger no longer appear.

Tuesday, September 15, 2009

A Reminder of Who We Should Be

Just saw an excellent quote of George Bernard Shaw saying how active people behave:
"The people who get on in this world are the people who get up and look for the circumstances they want, and, if they can't find them, make them."


Linkpool: .Net Compact Framework

Today I need to refresh my knowledge of developing for Windows Mobile. So I surfed through my favorites tagged as Compact Framework and here is what I found:


Both articles are concentrated on older versions (1.0 and 2.0), but they still a good place for those who just need refresh knowledge or start developing for Windows Mobile.

Monday, September 7, 2009

Have you tried turning it off and on again?

"Turn it off and on again" is almost as canonic recipe as "Ctrl-Alt-Del". Here is an excellent video about first from "The IT Crowd" series:

Tuesday, August 4, 2009

Bjarne Stroustrup's wish came true

Yesterday I saw a quotation of Bjarne Stroustrup:
I have always wished that my computer would be as easy to use as my telephone.
My wish has come true.
I no longer know how to use my telephone.

To my mind this three sentences show that sometimes marketing people can turn even the simplest thing to a swiss knife. And these electronic swiss knifes are not so intuitive in use.

Linkpool

I'd like to share some stuff that I read/listen recently:


I believe this post will be a start of regular sets of articles that I find really exciting and interesting.

Thursday, July 30, 2009

Installing & uninstalling applications on emulator

Story 1. Installing application.
To install application to emulator adb utility will be handy:
  • Start emulator.
  • Open command prompt (cmd.exe).
  • Navigate to "tools" directory in Android SDK.
  • Run installation using command "adb install application.apk". For example, "adb install "C:/com.andreware.sample.apk"" when com.andreware.sample.apk is located at root directory on disk C.
  • Wait couple of seconds while application is being installing.

Story 2. Uninstalling application.
There two ways to uninstall application from emulator: uninstall like on real device or use adb utility. First way allows to uninstall any application while adb utility will allow to uninstall only application installed using it (including the ones deployed from IDE).
Let's look at first one first. It is pretty simple and straitforward:
  • Start emulator.
  • On the home screen press the "Menu" button.
  • Choose"Settings" item from menu.
  • Choose "Applications" item in the settings list.
  • Choose "Manage applications".
  • Choose application that you want to uninstall.
  • In the "Application info" window that will appear click "Uninstall" button.
  • Confirm uninstalling.
  • Wait a second while application is being uninstalling and click "OK" on next window that says "Uninstall finished".
Second way requires usage of command line and adb utility:
  • Start enulator.
  • Open command window (cmd.exe).
  • Navigate to "tools" directory in Android SDK.
  • Run remote shell: "adb shell".
  • Goto app directory: "cd /data/app".
  • Now you can list installed applications: "ls".
  • To uninstall application use "rm" command and appropriate apk file. For example, "rm com.andreware.sample.apk".
  • Type "exit" to leave remote shell.

Using Android standard icons in designer

Today I wanted to use standard search icon on one of the buttons. When I want to use custom icon I use Reference Chooser dialog. As a result I have such a reference in a property:
@drawable/search_icon
But Reference Chooser dialog does not provide a way to use standard icon (or I don't see it). Fortunately we can type reference directly to property value either in designer or plane xml. So to use standard drawables "@android:drawable/id" pattern can be used. For example, to set standard search icon I used this reference text:
@android:drawable/ic_menu_search

Wednesday, June 17, 2009

Setup Eclipse for BlackBerry Storm development

I've spent many hours trying to install BlackBerry plug-in v4.7 (needed to develop for Storm) on Eclipse and finally I found solution. As always solution was in one small detail. Here is the whole way to setup environment.

INSTALL J2SE
Download and install Java SE Development Kit. Personally I used JDK, but I think JRE should work as well.

INSTALL ECLIPSE
Download and install (actually unpack) Eclipse IDE for Java Developers if you don't have one. I must say that BlackBerry plug-in for Eclipse contains this IDE, but who knows what version did they pack into plug-in installer.

DOWNLOAD COMPLETE ECLIPSE SOFTWARE UPDATE
Once you checked that your Eclipse is working you need to install BlackBerry Eclipse plug-in. Go to BlackBerry JDE Plug-in for Eclipse and download Full Installer and Eclipse Software Update for the BlackBerry JDE v4.7 Component Pack.

INSTALL ECLIPSE BLACKBERRY PLUGIN
Install plug-in from Full Installer first. It will ask you to install new Eclipse or specify existing one. Just point to your Eclipse folder and proceed installation process.
Since Full Installer does not provide you with Storm emulator and v4.7 platform you need to install v4.7 Component Pack. RIM web site suggests to install this update using update site. Don't do it. If you already tried to go this as discribed in instructions you will need to perform step 4. Here is correct way to install update:
  1. 1. Run Eclipse
  2. 2. Go to Help > Software_Updates
  3. 3. Switch to Available_Software tab
  4. 4. Make sure that you don't have a link to "http://www.blackberry.com/go/eclipseUpdate" there. If you have follow step 4.1 otherwise jump to step 5.
    • Remove link to RIM update site using Manage_Sites button.
  5. 5. Add new site like this:
    • Click Add_Site button.
    • Click Archive button and select update file downloaded earlier.
    • Click OK.
  6. 6. Check this new node in the list of available software and click Install button.
  7. 7. Follow instructions in installer.

SETUP ECLIPSE TO USE BLACKBERRY 4.7 JDK
Now you will have 4.7 installed, but not set as default. You need to change default component from 4.5 to 4.7.
To do so you need to:
  • Create new workspace and add BlackBerry project (File > New > Project and pick BlackBerry project).
  • Go to BlackBerry > Configure_BlackBerry_Workspace in Eclipse main menu.
  • Navigate to BlackBerry_JDE > Installed_Components
  • And change component from 4.5 to 4.7

That's it. Now you can start playing with Eclipse environment for BlackBerry.

P.S.
There are some problems with simulator under Eclipse. I wrote about this in BlackBerry simulator in Eclipse could work better.

There is no "enum" keyword for BlackBerry

In one of projects I'm working on I needed to port some code from Android to BlackBerry platform. As part of implementation for Android I used enumeration.
As I saw there is no "enum" keyword for BlackBerry. That was hard to understand since I like enums as a natural way to group constants. Anyway I had two options: use simple constants or design a class. I decided on the second one.

So for enum that looks like this:
enum Numers {
Odd, Twin;

public int toInt() {
return (this == Odd) ? 0 : 1;
}

public static Numbers fromInt(int value) {
return (value == 0) ? Odd : Twin;
}
}
I used class like this:
class Numbers {
public static Numbers Odd = new Numbers(0);
public static Numbers Twin = new Numbers(1);

private int _value;

private Numbers(int value) {
_value = value;
}

public int toInt() {
return this._value;
}

public static Numbers fromInt(int value) {
return (value == 0) ? Odd : Twin;
}
}
Not so natural as with "enum" keyword, but good enough :)