Ik heb de afgelopen 2 dagen aan een klein tooltje gewerkt om wat tekortkomingen van de normale SendTo Email Recipient weg te werken.
De reden dat de titel begint met Outlook is dat het alleen met de volledige Outlook werkt, en dan heb ik het nog niet (NOG NIET! Dat komt nog) met een versie < Office 12 (Office 2007) heb getest.
Als je de installatie uitvoert nestelt het zich in de Send To map (Kopiëren naar in een Nederlandse Windows).
En dan kan je dat gewoon op een map doen, en hij zal alle bestanden in die map kopieren naar een nieuwe mail (recursive, dus gij opent alle onderliggende mappen, en daar in ook weer alle onderliggende mappen…).
Ook maakt hij gewoon een HTML emailtje aan, ipv een stom tekst emailtje.
Ook vraagt hij niet om foto’s te verkleinen, want met het huidig internet is dat echt niet nodig.
Hieronder vind je de code (meer is het niet, buiten wat resources), het project vind je hier (rar), en de gecompileerde installer vind je hier:
using System;
using System.Collections.Generic;
using System.IO;
using Outlook = Microsoft.Office.Interop.Outlook;
namespace OutlookSendToExtended
{
///
/// This class creates the mail, adds the files,
/// and provides a function to display the emailwindow
///
/// Main method defined below
///
class OutlookSendToExtendedMain
{
#region Private vars
///
/// Holder for the Application entity
///
private Outlook.Application outlook;
///
/// Holder for the mail entity
///
private Outlook.MailItem mailItem;
#endregion
#region Constructor(s)
///
/// Constructor
///
///
array of files/folders
public OutlookSendToExtendedMain(string[] args)
{
//create a new application
this.outlook = new Outlook.Application();
//create new emailitem
this.mailItem = (Outlook.MailItem)outlook.CreateItem(Outlook.OlItemType.olMailItem);
//loop over the fixed args
foreach (string fixedArg in this.FixArgs(args))
{
//add the attachment
mailItem.Attachments.Add(fixedArg, Outlook.OlAttachmentType.olOLE, 1, fixedArg);
}
//to be implemented
//mailItem.SendUsingAccount
}
#endregion
#region Methods
///
/// Enumerates over the args, expanding the folders in it
///
///
array of files/folders
/// array of files
private string[] FixArgs(string[] args)
{
List fixedArgs = new List();
//loop
foreach (string arg in args)
{
//if it is a directory
if (Directory.Exists(arg))
{
try
{
//join the dirs and files
List listOfAll = new List();
listOfAll.AddRange(Directory.GetFiles(arg));
listOfAll.AddRange(Directory.GetDirectories(arg));
//recursive call
fixedArgs.AddRange(this.FixArgs(listOfAll.ToArray()));
}
catch (Exception)
{
//to much exceptions to catch, catch the base.
//what can we do? maybe talk to user.
//thinking about this
}
}
else
{
//it is a file, add it
fixedArgs.Add(arg);
}
}
//return the array
return fixedArgs.ToArray();
}
public void DisplayEmail()
{
//display the email
this.mailItem.Display(false);
}
#endregion
#region Static methods
///
/// Entrypoint
///
///
array of files/folders to be attached
static void Main(string[] args)
{
if (args.Length != 0)
(new OutlookSendToExtendedMain(args)).DisplayEmail();
return;
}
#endregion
}
}
Even een toelichting bij de Setup: er is een PostBuildEvent gedefinieerd, die wat doet met WiRunSQL.vbs (tooltje om de database van een MSI aan te passen).
Hij voegt DISABLEADVTSHORTCUTS toe met value 1 in de Property tabel.
Waarom? Omdat ik een shortcut maak in de SendTo folder, en aangezien Advertised Shortcuts daar niet werken, moeten we dit afzetten. Dit is de enige manier hiervoor, Visual Studio bied hier geen interface voor aan.
Als je een project maakt, en je wilt een kleinere database hebben in de plaats van een MSSQL database (mdf) kan je altijd overwegen een sdf (Compact edition).
Helaas kan je niet standaard LINQ to SQL klassen gebruiken dan (dbml).
Daarvoor kan je wel dit tooltje gebruiken, en de klassen genereren.
Hier volgt wat je in de verschillende textboxen moet invullen, kan je even gemakkelijk copy/pasten.
Title: Make &Linq classes for Database
Command: %vsspv_windows_sdk_dir%\bin\SqlMetal.exe
Arguments: $(ItemPath) /dbml:DataClasses$(ItemFileName).dbml /pluralize /context:DataContext$(ItemFileName)
InitialDirectory: $(ItemDir)
Dan ga je in je project op een .sdf staan, doe je tools > beneden ‘Make Linq classes for Database’, en dan doe je rechtermuisknop op je project > add extisting item > (alle files laten weergeven) > dubbelklik op de dbml.
That’s it, nu kan je eender waar in je project dit doen:
DataContextFuel dataContextFuel = new DataContextFuel(DataLayer.Properties.Settings.Default.FuelConnectionString);
Als je op een machine met Vista 64-bit Visual Studio 2008 met SQL Server 2008 Express wilt gebruiken, kan je niet service based databases openen / toevoegen aan een project.
Voor de rest ging de upgrade smooth: detachen van de databases, SQL Server 2005 removen, en SQL Server 2008 installeren. Jammer van deze bug, en nog irritanter: sdf (compact database) ondersteund geen LINQ, ik zit dus vast aan mdf.
Naar aanleiding van het commentaar van whoami op mijn vorige blogpost ben ik er verder gaan kijken naar het behavior van Button.IsDefault.
Ik heb de volgende testcase gemaakt:
En de volgende code backend:
using System.Windows;
namespace TestCase
{
///
/// Interaction logic for Test.xaml
///
public partial class Test : Window
{
public Test()
{
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(sender.ToString());
}
}
}
Als je dit start zal je zien dat beide knoppen zijn gefocust.
Duw je dan op enter wordt de eerste knop gefocust (er wordt geen knop getriggert), en als je daarna nogmaals op enter duwt wordt er op de eerste knop getriggerd.
Ik heb net gemerkt dat als men Visual Studio 2008 opent als Administrator (voor het aanmaken van de website bij IIS) de scrolling functie van mijn Synaptics touchpad niet werkt. Hij heeft er dus geen toegang tot.
Synaptics Touchad enhancer openen als Administrator helpt, maar daar moet je dan een geplande taak van maken, anders doet UAC iedere keer moeilijk.
Iedere programmeur komt het wel eens tegen: een app schrijven in u devomgeving (Vista x64 hier), en dan backwards compatibilty checken met XP, Vista x32, Server 2k3, you name it.
Daarvoor heeft VMware heel leuk speelgoed voor, namelijk de virtuele debugger.
Even uitleggen:
Op u host opent ge Visual Studio 2005/2008
In VMware opent ge een XP VM
Via de optie ‘VMware’ in Visual Studio launched ge u app IN de VM, en deze draait dan echt in XP
Debuggen maar!
Helaasch werkt VMware Workstation Virtual Debugger for Visual Studio 2005 niet samen met 2008.
Of wel? (Ik denk het wel, anders waart ge dit niet aan het lezen )
De stappen voor 32-bit host
Ga naar
C:\Program Files\VMware\VMware Workstation
Maak daar de volgende map aan:
Visual Studio Integrated Debugger
Open het bestand Visual~1.cab in de map
C:\Program Files\VMware\VMware Workstation
Pak de bestanden ws_vsid.pdf* en ws_vsid.dll* (niet vsid_ja.dll*!)
Nu is het oppassen: Als ge deze bestanden uitpakt met Winrar plaatst hij deze in een Virtual Store, om dat te omzeilen moet ge de .cab openen met de Windows geintergreerde zip-handler.
Pak deze dan uit naar de map
C:\Program Files\VMware\VMware Workstation\Visual Studio Integrated Debugger
Als ge het goed hebt gedaan, vraagt Vista u om toelating (UAC)
Dan opent ge een CMD als Administrator (rechtermuisknop > Run As Administrator)
Plak dit erin:
regsvr32 "C:\Program Files\VMware\VMware Workstation\Visual Studio Integrated Debugger\vsid.dll"
En als laatste, plak het volgende in een textbestand, sla op als vs.reg (niet vs.reg.txt!!!), en dubbelklik erop om het te mergen met het register:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\AddIns\VMDebugger.Connect]
"AboutBoxDetails"="For more information about VMware Inc, see their website at\\r\\nhttp://www.vmware.com\\r\\nFor customer support, call 1-800-xxx-xxxx\\r\\nCopyright (c) 2006 VMware Inc Inc."
"AboutBoxIcon"="C:\\Program Files\\VMware\\VMware Workstation\\Visual Studio Integrated Debugger\\vsid.dll,1"
"CommandLineSafe"=dword:00000000
"CommandPreload"=dword:00000000
"Description"="VMDebugger - Visual Studio Integrated Virtual Machine Debugger"
"FriendlyName"="VMDebugger"
"LoadBehavior"=dword:00000001
Hier volgen de stappen voor 64-bit host (praktisch identiek)
Ga naar
C:\Program Files (x86)\VMware\VMware Workstation
Maak daar de volgende map aan:
Visual Studio Integrated Debugger
Open het bestand Visual~1.cab in de map
C:\Program Files (x86)\VMware\VMware Workstation
Pak de bestanden ws_vsid.pdf* en ws_vsid.dll* (niet vsid_ja.dll*!)
Nu is het oppassen: Als ge deze bestanden uitpakt met Winrar plaatst hij deze in een Virtual Store, om dat te omzeilen moet ge de .cab openen met de Windows geintergreerde zip-handler.
Pak deze dan uit naar de map
C:\Program Files (x86)\VMware\VMware Workstation\Visual Studio Integrated Debugger
Als ge het goed hebt gedaan, vraagt Vista u om toelating (UAC)
Dan opent ge een CMD als Administrator (rechtermuisknop > Run As Administrator)
Plak dit erin:
regsvr32 "C:\Program Files (x86)\VMware\VMware Workstation\Visual Studio Integrated Debugger\vsid.dll"
En als laatste, plak het volgende in een textbestand, sla op als vs.reg (niet vs.reg.txt!!!), en dubbelklik erop om het te mergen met het register:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432node\Microsoft\VisualStudio\9.0\AddIns\VMDebugger.Connect]
"AboutBoxDetails"="For more information about VMware Inc, see their website at\\r\\nhttp://www.vmware.com\\r\\nFor customer support, call 1-800-xxx-xxxx\\r\\nCopyright (c) 2006 VMware Inc Inc."
"AboutBoxIcon"="C:\\Program Files (x86)\\VMware\\VMware Workstation\\Visual Studio Integrated Debugger\\vsid.dll,1"
"CommandLineSafe"=dword:00000000
"CommandPreload"=dword:00000000
"Description"="VMDebugger - Visual Studio Integrated Virtual Machine Debugger"
"FriendlyName"="VMDebugger"
"LoadBehavior"=dword:00000001
And shepherds we shall be, for thee my Lord for thee, power hath descended forth from thy hand, that our feet may swiftly carry out thy command. We shall flow a river forth to thee, and teeming with souls shall it ever be. In nomine Patris, et Filii, et Spiritus Sancti.