News
Events
Leadership Team
Technical Team
Jobs
Clients
Partners
Culture
Read Blogs
Call Us
Jobs
Follow Us
eImagine Blogs
eImagine takes great pride in our people. Our staff includes many outstanding professionals with deep industry knowledge and business experience. Our blogs reflect that, and cover a broad range of solutions and services. Search our blogs by author, category, or keywords.
Go Back
  • Rapid Prototype Site Customization in Microsoft SharePoint

     

    Too many times I have been asked to provide a SharePoint portal solution with little time for preparation and customization. When you are starved for time and have to demonstrate a prototype solution to a client, you are pretty much left with the out-of-the-box SharePoint features. Most of the time, that just isn't custom enough for the client.

    The biggest problem with this is that the View and Edit forms for items in SharePoint are simply not customizable outside the SharePoint designer. For libraries and lists, the View page is determined to show too much irrelevant information, and you have to rely on the scarce amount of form validation (required fields) and zero form manipulation on the Edit page. This had caused me to either spend more time on prototypes than I preferred, or forced me to demonstrate more basic features than I was really comfortable.

    And then I discovered a trick. Because pretty much all SharePoint pages are built of modular Web Parts,
    you can add the following to the URL the any page and force it in to Edit mode:

    &ToolPaneView=2

    That little trick pops up the Web Part tool pane and puts the page in familiar "Edit" mode. Not only can you add standard SharePoint Web Parts to Edit and View forms, but you can use the Content Editor Web Part (inserted and hidden at the bottom of the form) to add JavaScript enclosed in <script> tags for DOM modification. This is great for hiding fields, providing more advanced client-side form validation, and general branding on pages that were previously unbrandable. And it is all done straight through your browser.

    This great for a prototype or demo site but be careful though, as Microsoft does not officially support this on Form pages. For a full-fledged project do it the right way in SharePoint Designer. But if you are asked to build a site demo rapidly and need a little more than the basics, this is the way to go! It works in MOSS as well as WSS. Enjoy!

    Full story

    Comments (0)

  • Taking A Serious Look At Certifications...

    Certifiable???

    I have been getting a lot of questions lately, since I have achieved three Microsoft certifications this year with another promised by October. For the first five months of the year, I was struggling to find the time and motivation to study. The key for me was to find or create both those elements, at the same time. Here are some tips for what worked for me...

    TV Rots The Brain, Snookie

    Everyone is busy these days--We're all overworked, overbooked, and value any little time to ourselves we can grab. But when time to ourselves is just sitting in front of the television watching whatever is on... That time can be better spent. If a show was on in an hour, I found myself watching the previous hour leading up to it with whatever was on. I cut out that mindless hour each night and dedicated the time to studying. As a reward, I would finish and watch the show I actually intended on seeing! Believe me, there is nothing to miss on reruns of Jersey Shore... Or to really be honest, on new episodes either.

    Sorry, FaceBook :(

    Are you really going to miss out on life if you spend less time on FaceBook looking at photos of your friends and their pets? I cut out some of my tweeting and FaceBook stalking and suddenly found myself with extra time to study during the day, especially around lunch time. And despite popular belief, my social life did not wither and die.

    "What's My Motivation?"

    I spent five months avoiding thinking about my exam and studying. Since I kept procrasinating, there was no way to get motivated. What really did it for me was the change to the MS partner network coming this year. Suddenly, specific certifications will mean a lot more and that motivates me to make myself a commodity. Does my career depend on it? Probably not, but I see a way to differentiate myself and stand out in a good way. It's the same reason I am the only person on the 3rd floor to wear a tie every day. Everyone's motivation is different... You just have to find it, and to find it you have to think about it.

    5 Seconds MacGruber!

    This may be obvious, but once you pay money to schedule your exam, it suddenly becomes a lot more real. Maybe it's the fear of failure, maybe it's the cheapskate in us all that doesn't want to waste the $125, or maybe it's the ticking clock counting down to your doom... Whatever the underlying reason, having a hard deadline is a strong motivator. I put a target date on my exam, and once I got within a couple weeks I anted up and got official with it. When you're in cram mode with a day left you can always find some extra time to study!

    Full story

    Comments (0)

  • Enforce Correct Usage By Wrapping Types

     
    I came across this post by @jsonmez last week via @elegantcode: "Enforce Correct Usage By Wrapping Types".

    Enforce Correct Usage By Wrapping Types: Have you ever written an API or a method and expected it to be used a cer... http://bit.ly/9AHp4aless than a minute ago via twitterfeed

     

    In it, John tackles the problem of ensuring your code is used by other developers as you intended. He gives an example of a method that takes a date parameter that *should* be calculated using certain business logic. How do you prevent another developer from using this method and passing in a hard-coded date?

    Normally, one might write up some documentation or add xml comments to the code describing how the method should be used, what parameters are needed, and so on. Of course, there's no guarantee that those guidelines will be followed, if read at all. A second solution is to write a utility class that calculates the parameter using the correct logic (this is what I see most often). This is still no guarantee since it requires knowledge of the utility class's existence and where to find it.

    The better way, John writes, is to not accept primitive types at all! Instead, wrap the parameter in a data type that creates the needed type with the required business logic. This allows you to force the correct input instead of having to validate anything that might be thrown in. 

    For a simple code example and more ideas on where you might use this, check out his full post on elegantcode.

     

    Full story

    Comments (0)

  • Subscribing to a RSS feed in Outlook

    Chances are you already use a web app like Google Reader or Bloglines to subscribe to RSS feeds, but did you know that you can get the same feeds right in Outlook? While this might not be ideal for power users with hundreds of feeds, it's great for keeping up with one or two blogs. Here's how to set this up:

    1.       Open Outlook, and look on the left side for the RSS Feeds folder
    2.       Right-click on RSS Feeds and select Add a New RSS Feed
    3.       In the box that opens, paste in the blog URL (e.g. http://www.thinketg.com/blogs.rss.ashx)
    4.       Click Add, and in the following box, click Yes
    5.       If all went well, the feed is now added and will automatically populate with recent and future blog posts
    6.       Depending upon the type feed, the articles may be abbreviated. Our company blog is set up this way: simply look for View Article link (or something similar). Clicking that link will take you to the full article on the blog site.


    Full story

    Comments (0)

  • IT work in genetics/genomics

    Lab technician working with microsope

    Working in the Indiana State Department of Health Genomics department has given me a renewed interest in genetics and genomics. As the senior developer and team lead in the department I need to have a good understanding of the industry, even thought I'm not doing the splicing and sequencing myself! To clear things up for the layperson, "genetics" is the study of a genes individually and "genomics" is the study of genes all together (in a genome). What's the imact? Simply put, my work allows simple genetic tests to save the lives of children born in Indiana every day. The genetic testing we do for newborn screening is very interesting, and I am enjoying keeping up on the latest development in the industry. Part of me is wondering where I would be today if I had not switched my college major from Biology to Informatics and Computer Science...

    Full story

    Comments (0)

  • MS Dynamics CRM and Your Company's Facebook Fan Page

    In this post I’ll demonstrate how to create a newsletter subscription control on your Facebook fan page that feeds data into your Microsoft Dynamics CRM.

     Screenshot of newsletter button on Facebook Fan Page

    In MS Dynamics CRM:

    The first thing to do is create an attribute to store whether or not a contact wishes to receive the newsletter.

    Go to Settings, once there select ‘Customize Entities’. In the list of entities find and select the Contact entity. From the ‘More Actions’ drop down select Edit. On the left side of the window under the heading ‘Details:’ select Attributes. Create a new attribute and give it the display name ’Receive Newsletter’. Name the attribute ‘new_receive_newsletter’ (Note: Dynamics adds the ‘new_’ prefix automatically to all custom attributes, unless you have changed the default settings.) Next, set the Type field to bit and Save the attribute.

    In Asp.Net:

    In Visual Studio create a new ASP.NET Web Service project. Right click on the new project and select “Add Web Reference…” from the menu. The “Add Web Reference” window will open, from there you need to enter the url to the MS Dynamics CRM web service. (Note: It’s usually something like “http://urlToYourCRM/MSCRMServices/2007/CRMService.asmx”.) Click “Go” and VS will find any services located at the entered url. In the “Web reference name:” text box enter the name of the Namespace for the web service, I’ll be using “CrmSdk” for this example.

    Now open view the code for your web service. The first method we are going to add is for convenience:

    Listing 1.
        private CrmService GetCrmService()

        {

            CrmService crmService = new CrmService();

            crmService.Url = "http://urlToYourCRM/MSCRMServices/2007/CRMService.asmx";

            crmService.Credentials = new NetworkCredential("username", "password", "domain");

           

            crmService.CrmAuthenticationTokenValue = new CrmAuthenticationToken();

            crmService.CrmAuthenticationTokenValue.OrganizationName = "organization name";

            return crmService;

        }

    This method just creates an instance of the CrmService object and populates it with the information it needs to access you CRM. For simplicity in this example, all the values are inline but in your implementation you could store all this information in the web.config.

     

    Listing 2.
        private contact GetContact(string email)

        {

            ColumnSet columns = new ColumnSet();

            columns.Attributes = new string[] {

                "firstname",

                "lastname",

                "emailaddress1",

                "new_receive_newsletter " 

            };

            ConditionExpression emailCond = new ConditionExpression();

            emailCond.AttributeName = "emailaddress1";

            emailCond.Operator = ConditionOperator.Equal;

            emailCond.Values = new object[] { email };

            QueryExpression query = new QueryExpression();

            query.ColumnSet = columns;

            query.EntityName = EntityName.contact.ToString();

            query.Criteria = new FilterExpression();

            query.Criteria.FilterOperator = LogicalOperator.And;

            query.Criteria.Conditions = new ConditionExpression[] { emailCond };

            var result = GetCrmService().RetrieveMultiple(query);

            try

            {

                var u = result.BusinessEntities[0];

                return u as contact;

            }

            catch (Exception)

            {

                return null;

            }

        }

    In Listing 2, there is another convienence method for retrieving an existing contact from the CRM by their email address. This is used to ensure that we don’t duplicate a contact.

    Listing 3.
        [WebMethod]

        public bool SubscribeUser(string firstName, string lastName, string email)

        {

            bool create = false;

            contact c = this.GetContact(email);

            if (c == null)

            {

                create = true;

                c = new contact();

            }

            c.firstname = firstName;

            c.lastname = lastName;

            c.emailaddress1 = email;

            c.new_receive_newsletter = new CrmBoolean() { Value = true };

            if (create)

            {

                GetCrmService().Create(c);

            }

            else

            {

                GetCrmService().Update(c);

            }

            return true;

        }

    Listing 3 is the actual web service method Facebook will be calling. It uses the method from Listing 2 to get an existing contact if there is one, then update it with the information provided by Facebook. Depending on if the contact already exists, the contact is passed to either Create or Update accordingly.

    Now that the web service is created we can make it work with Facebook. While ASP.NET web services are capable of responding in JSON, they only do so if the incoming request is sent in JSON as well. Facebook will not be sending the request in JSON, it will be sent as a plain HTTP Post. In order to for this to work we have to intercept responses going to Facebook and convert them to JSON. To achieve this we need to create a HttpModule. Start by adding a new class to the project named FacebookCleanserModule. The class needs to implement the interface IHttpModule, so add that and implicitly implement the interface. We need to add the following code in the resulting class:

    Listing 4.
        public void Init(HttpApplication context)

        {

          context.BeginRequest += new EventHandler(context_BeginRequest);

    context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);

        }

        void context_ReleaseRequestState(object sender, EventArgs e)

        {

    HttpApplication app = (HttpApplication)sender;

    HttpResponse res = app.Response;

    if (this.isFBAjax)

    {

    res.ContentType = "application/json; charset=utf-8";

    res.ContentEncoding = Encoding.UTF8;

    res.Filter = new XMLtoJSONFilter(res.Filter);

    }

        }

        void context_BeginRequest(object sender, EventArgs e)

        {

    HttpApplication app = (HttpApplication)sender;

    HttpRequest req = app.Context.Request;

    string form = new StreamReader(req.InputStream).ReadToEnd();

    if (form.ToLower().Contains("fb_sig_is_ajax"))

    {

    this.isFBAjax = true;

    }

    if (req.InputStream.CanSeek)

    {

    req.InputStream.Position = 0;

    }

        }

    Next we have to add the class XMLtoJSONFilter to our project. The class should look like this:

    Listing 5.
    public class XMLtoJSONFilter : Stream

    {

        private readonly Stream _stream;

        private long _position;

        public XMLtoJSONFilter(Stream stream)

        {

            this._stream = stream;

        }

        public override bool CanRead

        {

            get { return this._stream.CanRead; }

        }

        public override bool CanSeek

        {

            get { return this._stream.CanSeek; }

        }

        public override bool CanWrite

        {

            get { return this._stream.CanWrite; }

        }

        public override void Flush()

        {

            this._stream.Flush();

        }

        public override long Length

        {

            get { return this._stream.Length; }

        }

        public override long Position

        {

            get

            {

                return this._position;

            }

            set

            {

                this._position = value;

            }

        }

        public override int Read(byte[] buffer, int offset, int count)

        {

            return this._stream.Read(buffer, offset, count);

        }

        public override long Seek(long offset, SeekOrigin origin)

        {

            return this._stream.Seek(offset, origin);

        }

        public override void SetLength(long value)

        {

            this._stream.SetLength(value);

        }

        public override void Write(byte[] buffer, int offset, int count)

        {

            string b = Encoding.UTF8.GetString(buffer, offset, count);

            XmlDocument doc = new XmlDocument();

            doc.LoadXml(b);

            string json = XmlToJSON(doc);

            byte[] data = Encoding.UTF8.GetBytes(json);

            this._stream.Write(data, 0, data.Length);

        }

        private string XmlToJSON(XmlDocument xmlDoc)

        {

            StringBuilder sbJSON = new StringBuilder();

            sbJSON.Append("{ ");

            XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, true);

            sbJSON.Append("}");

            return sbJSON.ToString();

        }

        //  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array

        private void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)

        {

            if (showNodeName)

                sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");

            sbJSON.Append("{");

            // Build a sorted list of key-value pairs

            //  where   key is case-sensitive nodeName

            //          value is an ArrayList of string or XmlElement

            //  so that we know whether the nodeName is an array or not.

            SortedList childNodeNames = new SortedList();

            //  Add in all node attributes

            if (node.Attributes != null)

                foreach (XmlAttribute attr in node.Attributes)

                {

                    if (!attr.Name.ToLower().StartsWith("xmlns"))

                    {

                        StoreChildNode(childNodeNames, attr.Name, attr.InnerText);

                    }

                }

            //  Add in all nodes

            foreach (XmlNode cnode in node.ChildNodes)

            {

                if (cnode is XmlText)

                    StoreChildNode(childNodeNames, "value", cnode.InnerText);

                else if (cnode is XmlElement)

                    StoreChildNode(childNodeNames, cnode.Name, cnode);

            }

            // Now output all stored info

            foreach (string childname in childNodeNames.Keys)

            {

                ArrayList alChild = (ArrayList)childNodeNames[childname];

                if (alChild.Count == 1)

                    OutputNode(childname, alChild[0], sbJSON, true);

                else

                {

                    sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ ");

                    foreach (object Child in alChild)

                        OutputNode(childname, Child, sbJSON, false);

                    sbJSON.Remove(sbJSON.Length - 2, 2);

                    sbJSON.Append(" ], ");

                }

            }

            sbJSON.Remove(sbJSON.Length - 2, 2);

            sbJSON.Append(" }");

        }

        //  StoreChildNode: Store data associated with each nodeName

        //                  so that we know whether the nodeName is an array or not.

        private void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)

        {

            // Pre-process contraction of XmlElement-s

            if (nodeValue is XmlElement)

            {

                // Convert  <aa></aa> into "aa":null

                //          <aa>xx</aa> into "aa":"xx"

                XmlNode cnode = (XmlNode)nodeValue;

                if (cnode.Attributes.Count == 0)

                {

                    XmlNodeList children = cnode.ChildNodes;

                    if (children.Count == 0)

                        nodeValue = null;

                    else if (children.Count == 1 && (children[0] is XmlText))

                        nodeValue = ((XmlText)(children[0])).InnerText;

                }

            }

            // Add nodeValue to ArrayList associated with each nodeName

            // If nodeName doesn't exist then add it

            object oValuesAL = childNodeNames[nodeName];

            ArrayList ValuesAL;

            if (oValuesAL == null)

            {

                ValuesAL = new ArrayList();

                childNodeNames[nodeName] = ValuesAL;

            }

            else

                ValuesAL = (ArrayList)oValuesAL;

            ValuesAL.Add(nodeValue);

        }

        private void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName)

        {

            if (alChild == null)

            {

                if (showNodeName)

                    sbJSON.Append("\"" + SafeJSON(childname) + "\": ");

                sbJSON.Append("null");

            }

            else if (alChild is string)

            {

                if (showNodeName)

                    sbJSON.Append("\"" + SafeJSON(childname) + "\": ");

                string sChild = (string)alChild;

                sChild = sChild.Trim();

                sbJSON.Append("\"" + SafeJSON(sChild) + "\"");

            }

            else

                XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName);

            sbJSON.Append(", ");

        }

        // Make a string safe for JSON

        private string SafeJSON(string sIn)

        {

            StringBuilder sbOut = new StringBuilder(sIn.Length);

            foreach (char ch in sIn)

            {

                if (Char.IsControl(ch) || ch == '\'')

                {

                    int ich = (int)ch;

                    sbOut.Append(@"\u" + ich.ToString("x4"));

                    continue;

                }

                else if (ch == '\"' || ch == '\\' || ch == '/')

                {

                    sbOut.Append('\\');

                }

                sbOut.Append(ch);

            }

            return sbOut.ToString();

        }

    }

    This class will act like a normal stream, but by setting it up as the response filter (in Listing 4) it will receive the XML from our web service and parse it out into an equivalent JSON object and return that instead. Now we have to register the module in the web.config.

    Listing 6.
    <configuration>

      <system.web>

        <httpModules>

          <add name="FacebookCleanserModule" type="FacebookCleanserModule"/>

        </httpModules>

      </system.web>

    </configuration>

    Listing 7.
    <configuration>

      <system.webServer>

        <modules>

          <add name="FacebookCleanserModule" type="FacebookCleanserModule"/>

        </modules>

      </system.webServer>

    </configuration>

    Listing 6 shows how to register the module on IIS 6.0 or IIS 7.0 running in Classic Mode whereas Listing 7 is for IIS 7.0 running in Integrated Mode. There is just one more change we need to make to the web.config:

    Listing 8.
    <configuration>

      <system.web>

        <webServices>

          <protocols>

            <add name="HttpPost"/>

          </protocols>

        </webServices>

      </system.web>

    </configuration>

    By adding the HttpPost protocols to webServices we allow Post requests to our web service. Now all of this needs to uploaded to a web accessible host, since Facebook uses a proxy on their local server for AJAX requests, this can’t be hosted on your local machine.

    In Facebook:

    If you don’t already have a Facebook Fan Page, you need to create one, at the time of this writing it can be done at http://www.facebook.com/pages/create.php. Once you have a Fan Page add the Static FBML application to it. Edit your fan page and under the list of Applications you should see an entry from FBML, click edit on that entry. Start by entering the structural elements of your FBML.

    Listing 9.
    <a href="#" onclick="showform()">Subscribe</a>

    <fb:js-string var="subscribePopup">

        <div class="newsLetterControl">

        <form id="subscribeForm">

            <p>

                <span>Email:</span><input name="email" id="txtEmail" /></p>

            <p>

                <span>First Name:</span><input name="firstName" id="txtFName" /></p>

            <p>

                <span>Last Name:</span><input name="lastName" id="txtLName" /></p>

                </form>

        </div>

        </fb:js-string>

    As you see in Listing 9 we have a tag that starts with “fb:”, that just denotes that it is one of Facebook’s custom elements. In this case, the element takes whatever it contains and converts it to an object for use within your Javascript instead of displaying it.

    Screenshot of finished newsletter popup on Facebook

    Now we need to add logic:

    Listing 10.
    <script>

    <!--

        function showform() {

            new Dialog().showChoice('Demo Newsletter Subscription', subscribePopup).onconfirm = function() {

                var params = document.getElementById('subscribeForm').serialize();

                var ajax = new Ajax();

                ajax.responseType = Ajax.JSON;

                ajax.ondone = SubscribeCallback;

                ajax.post('http://urlToYourService.asmx/SubscribeUser', params);

            };

            return false;

        }

        function SubscribeCallback() {

            new Dialog().showMessage("Demo Newsletter Subscription", "You have been successfully subscribed.");

        }

    //-->

    </script>

    The code in Listing 10 will display a Facebook Dialog box with the contents of the <fb:js-string> tag as it’s contents. When the user fills out the form and clicks “Okay” it pulls out the form data and sends it to the web service you created earlier. When the AJAX call is successful it calls the method SubscribeCallback and displays a message to the user that they are subscribe to the newsletter.

    Full story

    Comments (25)

  • Not So Small Business Server

    Windows Small Business Server 2008 may have small in the name, but it is anything but small on features. The same technologies used by some of the largest corporations to handle messaging, security, remote access, and collaboration are part of the Small Business Server product. Microsoft has simply packaged them all together, made some tweaks to facilitate running them all on one server, and put some limitations on the number of users that can utilize the services. In this blog, I will highlight the main components of Windows Small Business Server 2008, and what function each performs.

     

    Windows Server 2008

    This is the core operating system that handles basic server functions like user authentication, file sharing, and printer sharing. Other common function like DHCP (IP address assignment), DNS (Domain Names System), VPN (Virtual Private Networking) support, and Terminal Services (Remote Access) are also handled by the operating system. Windows Server 2008 also includes NTBackup, the built in utility for handling system backups.

     

    Microsoft Exchange Server 2007

    This powerhouse application handles not only email messaging, but also provides a mechanism for sharing calendars, managing meetings and appointments, and scheduling resources like conference rooms and projectors. Think of Exchange as a conduit that coordinates people, places, and things.

     

    Microsoft SharePoint Services 3.0

    SharePoint Services does exactly what its name implies. SharePoint provides a web portal for sharing file and photos,  having group discussions, organizing and sharing company documentation and processes, and provides a foundation for creating workflow rules to help your business run more efficiently.

     

    Microsoft Windows Server Update Services
    The Windows Server Update Services provide a centralized mechanism for downloading and applying critical security and application updates to the server and workstations. Not only does this provide ease of mind and reduce IT support time, it also helps decrease bandwidth utilization on your Internet connection because only the server has to download the updates from Microsoft.

    Microsoft SQL Server 2008 (SBS Premium Edition only)
    Microsoft SQL Server is a standards based relational database system that provides a comprehensive data management and analysis solution. Many key line-of-business applications such as accounting and customer relationship management software utilize SQL Server as their database foundation. SQL Server also includes SQL Reporting Services which enables web-based delivery of reports, along with data export and automated report delivery features.

    Other Small Business Server Features

    To aid a small business in utilizing the components listed above, Microsoft has packaged quite a few goodies into Small Business Server. These useful applications are built on the key components and serve to illustrate the power of the platform. For example, a base SharePoint site is installed right out of the box that provides a full-featured Help Desk ticketing system. With a few minor tweaks, this can be converted into a customer service application, or call center monitoring system.

     

    Remote Web Workplace is another Small Business Server speciality. Built upon Microsoft Terminal Services, Remote Web Workplace provides remote access to both servers and workstations and does so using only a web browser and a single public IP address. This is very similiar to what many small businesses achieve through third party providers like LogMeIn or GoToMyPC. I have encountered far too many small businesses paying for these services simply because they did not know that their Small Business Server provided it for free.

     

    Conclusion
    Microsoft Windows Small Business Server is probably one of the most under-utilized platforms I've encountered. Far too many business owners and IT managers are not harnessing the power that is literally at their fingertips. For that reason, eImagine and Microsoft are hosting a seminar in February 2010 to help educate those in the community that either already own Small Business Server, or are looking at it for the future. We will go into much more depth on each of the components to ensure that those in attendance will see the potential and put it into action.

     

     

    Full story

    Comments (0)

  • Using XP Mode Virtual Applications in Windows 7

    Windows 7’s XP Mode offers users a great option when it comes to providing legacy application compatibility.  Using Integrated Mode to run applications can be almost seamless.  Setup and configuration is easy, especially if you’re already familiar with Virtual PC.

    Just installing applications from the XP Mode desktop is often all you need to do.  (Assuming the Auto Publish setting is enabled.)  I always test the applications once in the desktop mode before running in integrated mode.  Also, make sure you completely log out of the XP Mode desktop before trying to run the newly installed application.

    If you want access to an application already installed, like Internet Explorer 6, it requires a little more setup.  Adding a shortcut to the Start Menu folder for All Users will work for most applications.  This also works for applications don’t have installers or don’t setup the Start Menu for you.

    Accessing other Windows XP features like Windows Explorer via Integrated Mode isn’t possible by just adding a shortcut.  Also uncommon shortcut types like VPN connections won’t work.  To call Windows Explorer, I created batch file on the XP Mode desktop to “call explorer.”  I then made a shortcut to the batch file, changed the name and icon to match the original, and put it in the Start Menu.  Now I can access VPN connections and other features without having to open the XP Mode desktop.

    Full story

    Comments (0)