Archive for June, 2006

Redistributing a VB6 application the “Free way”

After finding out that my WISE installer had passed it’s 30 day limit, and my Installshield CD scratched beyond repair, I looked on the web for a free way to redistribute a VB6 application.
My first attempt, was Advanced Installer 4, which looked promising. However, it also, is a 30 day trial, if you want go beyond the absolute basics. For instance, my app required the Soap Toolkit,(a COM object), so that was beyond the basic version. Also, it couldn’t properly self-register the COM DLL’s in the Advanced mode either. – Waste of time.
I then came accross a Microsoft tool, Visual Studio Installer, which looked well. With a bit of fiddling, I got it to create an MSI. However, an MSI may not work first time on pre-XP machines, since the Windows Installer is not guaranteed to be on the machine, So I looked for a generic MSI to EXE converter
The best I found was this: Which you place in the same folder as the MSI.
I zipped them both together, and placed them on the website.
Categories: Uncategorized

Workaround for Bitmap ColorDepth in C#

I am almost cerain this is a bug in the .NET bitmap Codec, that you cannot change the color Depth… It always saves in its native format for Bitmap.
However, if you convert the image to a TIFF first, then it works.

Image imgTIFF = Image.FromStream(s);

ImageCodecInfo ici = GetEncoderInfo("TIFF");

EncoderParameter ep = new EncoderParameter(Encoder.ColorDepth,24L);

EncoderParameters eps =

new EncoderParameters(1);

eps.Param[0]= ep;


Image imgBMP = Image.FromFile(@"c:test.tiff");


(for reference:)


ImageCodecInfo GetEncoderInfo(string mimeType)


ImageCodecInfo[] encs = ImageCodecInfo.GetImageEncoders();

for (int ix = 0; ix <= encs.Length; ix++)


if ( encs[ix].CodecName.IndexOf(mimeType) != -1)


return encs[ix];



return null;


Categories: Uncategorized

Converting a Bitmap to a pixel array

I was looking for some high performance code to convert a bitmap into a 2D byte array, this is what I came up with.
first I have a class called pixel.
public class pixel


  public byte red;

  public byte green;

  public byte blue;



then I read it using some Unsafe code thus:

public pixel[,] BitmapToArray(Bitmap b)


pixel[,] bmpData=new pixel[b.Width,b.Height];

// GDI+ still lies to us – the return format is BGR, NOT RGB.

BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int stride = bmData.Stride;

System.IntPtr Scan0 = bmData.Scan0;



byte * p = (byte *)(void *)Scan0;

int nOffset = stride – b.Width*3;

int nWidth = b.Width * 3;

for(int y=0;y<b.Height;++y)


for(int x=0; x < nWidth; ++x )




case 0:

bmpData[x/3,y] =

new pixel();

bmpData[x/3,y].blue = (



case 1:

bmpData[x/3,y].green = (



case 2:

bmpData[x/3,y].red = (byte)(p[0]);





p += nOffset;




return bmpData;




Categories: Uncategorized

Converting a DataTable to CSV

This is a handly little C# function to convert a DataTable to CSV. Hope it’s useful..
public string DataTableToCSV(DataTable dt)
 string strCSV = "";
 string strSeperator = "";
 foreach(DataColumn dc in dt.Columns)
  strCSV += strSeperator + dc.ColumnName;
  strSeperator = ",";
 strCSV += "rn";
 foreach(DataRow dr in dt.Rows)
  strSeperator = "";
  foreach(DataColumn dc in dt.Columns)
   strCSV += strSeperator + dr[dc.ColumnName].ToString();
   strSeperator = ",";
  strCSV += "rn";
 return strCSV;
Categories: Uncategorized

SQL sever 2005 Management studio express

I’ve had SQL server 2005 installed on my server for some time now, and sucessfully running a few websites from it. I’ve had to work from the command line up to now, since, I couldn’t get any good GUI working.
I tried to download SQL server 2005 Management studio express, for which I had to upgrade the .NET framework on the server, upgrade MSXML, and then install the application.
Try to connect and….
Cannot connect to .SQLEXPRESS.
An error has occurred while establishing a connection to the server.  When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified) (.Net SqlClient Data Provider)
Error Number: -1
Severity: 20
State: 0
Program Location:
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Connect(Boolean& useFailoverPartner, Boolean& failoverDemandDone, String host, String failoverPartner, String protocol, SqlInternalConnectionTds connHandler, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject, Boolean aliasLookup)
   at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
   at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.SqlClient.SqlConnection.Open()
   at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.ObjectExplorer.ValidateConnection(UIConnectionInfo ci, IServerType server)
   at Microsoft.SqlServer.Management.UI.ConnectionDlg.Connector.ConnectionThreadUser()
Any ideas?
Categories: Uncategorized

Resource files for Classic ASP

I was looking to localize a classic ASP website, and was considering upgrading it to ASP.NET, but it seemed way too much work, so I decided to look to see if it was possible to create a localization framework for classic ASP. using the same type of resx files that are used for
So, given a simple piece of xml in semi-typical resx format:
 <data name="Hello!">
I then wrote an include file in classic asp, to handle translations in the form
(Precursed by a initResources("strings-it.xml"))
 Dim xmlResx
 Function initResources(ResourceFile)
  Set xmlResx=Server.CreateObject("Microsoft.XMLDOM")
 End Function
 Function Translate(english)
  Set objLst = xmlResx.getElementsByTagName("data")
  For i = 0 to (objLst.length -1)
    EnglishText = objLst.item(i).attributes.getNamedItem("name").text
 If english=EnglishText Then
  Translate= objLst.item(i).text
  Exit For
 End If
 End Function
20 Lines of code, prevented an overhaul of my application to .NET.
Ultimately, I plan this to be used for a spanish version of
Categories: Uncategorized
%d bloggers like this: