Mehr Infos zu nichts sagenden Fehlermeldungen

 Entwicklung  Kommentare deaktiviert für Mehr Infos zu nichts sagenden Fehlermeldungen
Okt 162009
 

Wer wusste das?

Ich bekomme zur Zeit immer eine Fehlermeldung im Word die mir eigenartig vorkommt.

Fehlermeldung

Das ist ein eingebettetes Excel im Word. Alles unter Office 2007. Excel ist aber sicher installiert.
Diese Meldung kommt nur wenn man a) ein Add-in im Excel hat das einige Events registriert hat und b) wenn Excel vor dem Word mit dem eingebetteten Excel startet. Aber sie kann durchaus auch in anderen Situationen auftreten. Ich habe ihm Internet einige gefunden.

Aber was interessant ist. Drückt mal “Ctrl + Shift + i”.

Fehlernummer unten rechts im Dialog

Es erscheint unten rechts eine Fehlernummer. Habe dazu zwar noch nichts gefunden aber das wird schon noch kommen.

Ich bin gespannt wo ich noch mehr von diesen Meldungen finde.

kick it on dotnet-kicks.de

Mai 072009
 

Ich habe so viel gutes über Windows 7, kurz W7, gelesen und gehört, da musste ich einfach zuschlagen als die RC im MSDN Subscription auftauchte. Ich war so mutig und habe mein Vista gekillt und W7 drüber installiert.

DVD rein, und los ging es. Es ging nicht lange da wurde ich nach der Partition gefragt wo ich das Teil installieren wolle. Ich wählt die Vista Partition, löschte sie und formatierte sie auch gleich. Dann wählte ich die Partition aus und klickte auf weiter. Aber was soll das?! W7 meinte es finde keine Partition wo es sich installieren könne. Aber ich habe doch soeben eine erstellt. Nach einigem suchen kam mir dann die Idee, dass ich den SATA Port auf dem ICH8 ChipSet noch irgend einen Modus ändern kann. Nach einigem Suchen habe ich das dann auch gemacht. Der wird aber bei jedem System wahrscheinlich anders heissen. Danach konnte ich die neue Partition auswählen und installieren. Der SATA Port wird dann in einem sehr kompatiblen Modus betrieben. Nach der Installation kann man das wieder umstellen.

Das ging dann auch ziemlich flott. Nicht lange und ich wurde nach einem Login Name gefragt. Kurz vorher wurde ich sogar nach den WLAN Verbindungsinformationen gefragt. Das fand ich cool. Schon bei der Installation von W7 kann man das WLAN konfigurieren.

Nach einem weiteren Neustart konnte ich mich dann das erste mal anmelden. Es kam der Willkommensbildschirm und die neue “Sanduhr”. Ist ja auch schon von Vista her bekannt. Die lief und lief und lief und lief und … Ihr ahnt es schon. Das WLAN tat wie verrückt, also dachte ich da wird noch was nachgeladen. Aber nach 20 Minuten verlor ich dann die Nerven und habe den Laptop einfach abgestellt. Nach dem nächsten Login kam wieder der Willkommensbildschirm. Aber nicht mehr so lange. Dann war ich das erste mal im W7. Cool.

Als erstes ist ja einfach mal schrauben angesagt. Es ist einfach alles einfacher zu finden. Bei Vista gibt es jetzt noch Sachen wo ich nicht weiss wo man es einstellt. Bei W7 fand ich alles auf anhieb. Weiss nicht wie so, aber es ist intuitiver.

Es fühlte sich auch viel schneller an als Vista. Zu diesem Zeitpunkt ist das ja klar. Es wurde ja gerade frisch installiert.

W7 fing auch gleich damit an diverse Updates zu laden. Eigentlich waren es nicht Updates sondern Treiber. Es wurde fast alles gefunden. Sogar die Grafikkarte. Allerdings habe ich dann die BETA Version des Treibers bei NVidia geladen. Jetzt sind nur noch etwa 4 Gerätetreiber pendent. Aber das ist nicht so wild. Ist eh nur für die Business Zeugs auf dem Laptop. Fernwartung und so.

Nachdem der Grafiktreiber drauf war konnte ich auch den entsprechenden Desktop einschalten. Ich muss sagen, genial.

Einfach an die neue Taskleiste muss ich mich noch gewöhnen. Irgend wie vermisse ich die Schnellstartleiste. Man kann sehr wohl Icons auf der Taskleiste platzieren. Aber wenn man das Programm öffnet ist das Icon nicht mehr da. Ich kann also den Explorer nur einmal öffnen. Da muss ich mich wohl noch damit arrangieren.

Bei mir kommt dann als allererst alles was zum Programmieren nötig ist auf die Kiste. Angefangen mit Visual Studio 2008 mit SP1. Alles kein Problem. Danach der SQL Server 2008 mit SP1. Beim SQL Server kam immer die Meldung das es bekannte Kompatibilitätsproblem gibt. Habe ich ignoriert und musste feststellen das er trotzdem läuft.

Das selbe auch bei den DEAMON Tools Lite. Meldung wegklicken und das Tool tut noch immer.

Danach kamen noch Office 2007 und all der kram den man sonst noch braucht. Alles kein Problem. Bislang konnte ich alles installieren und es lief auch alles.

Und jetzt, wo alles drauf ist?

Das Teil ist noch immer schnell. Sehr schnell. Nimmt weniger Speicher in Beschlag als Vista und fühlt sich einfach viel besser an. Vista? Nein Danke. Das will ich nicht mehr.

W7 ist das was Vista hätte sein sollen.

Schade nur das es kein Updatepfad auf die finale Version geben wird. Aber was sollst. Das ist wieder eine Chance das System auf Vordermann zu bringen. 🙂

kick it on dotnet-kicks.de

Office XP – deploy Add-in – Wie registriert man die Extensibility.dll

 Entwicklung, Software  Kommentare deaktiviert für Office XP – deploy Add-in – Wie registriert man die Extensibility.dll
Nov 282008
 

Wer suched der findet. Bei mir hat es jetzt sehr, sehr lange gedauert.

Ich habe ein Office XP Add-in das auf diversen Systemen mit verschiedenen Konfigurationen installiert werden muss. Ein Add-in für Office XP/2002 muss die Schnittstelle Extensibility.IDTExtensibility2 implementieren. Diese ist in der Extensibilty.dll definiert.

Auf einem XP mit SP2 und Office XP/2002 ohne SP ist die DLL aber nicht registriert, dass heisst nicht im GAC.

Auf dem Entwicklungsclient habe ich die DLL natürlich. Also, ich nehme die dll, kopiere sie auf das Zielsystem und versuche das Teil mit RegAsm.exe zu registrieren. Das führt zu einer Fehlermeldung in dieser form.

RegAsm : error RA0000 : Could not load file or assembly ‚Extensibility, Version= 7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a‘ or one of

Das Teil will einfach nicht in den GAC.

Wie bin ich nun vorgegangen um das Add-in auf einem frisch aufgesetzten System an den Start zu bringen.

  1. Man mache ein Setup. Das Setup mache ich NUR weil ich nicht weiss was alles in die Registry muss.
    Die Primäre Ausgabe wird bei Register auf vsdrpCOM gestellt.
    image
  2. Bei den Abhängigkeiten genau das selbe. Wenn ich die Office XP/2002 PIA Abhängigkeiten aus dem Setup ausschliesse, und sie deshalb nicht registriert werden, läuft das Add-in nicht mehr. Aber eigentlich müssten die Office XP/2002 PIA’s ja schon bei der Installation der Office XP/2002 PIA’s registriert worden sein.
    image
  3. Wenn man schon dabei ist, dann kann man auch gleich noch drei Registry Key importieren. Für jedes Office Programm das ein Add-in hat ein Schlüssel.

    Windows Registry Editor Version 5.00

    [HKEY_CURRENT_USER\Software\Microsoft\Office\Word\Addins\namespace.namespace]
    "Description"="Bschreibung"
    "FriendlyName"="Angezeigter Name des AddIns im Office"
    "LoadBehavior"=dword:00000003

    Die rot markierten Textteile müssen dann noch passend ersetzt werden.

  4. Das Add-in hat einen sehr einfachen Code.
  5. using System;
    using System.Text;
    using System.Reflection;
    using Extensibility;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace LAG.WordPlus.OfficeAddIns.Word2002
    {
    	public class Word2002 : Object, Extensibility.IDTExtensibility2
    	{
    		#region IDTExtensibility2 Member
    
    		public void OnAddInsUpdate(ref Array custom)
    		{
    		}
    
    		public void OnBeginShutdown(ref Array custom)
    		{
    
    		}
    
    		public void OnConnection(object Application, ext_ConnectMode ConnectMode, object AddInInst, ref Array custom)
    		{
    			MessageBox.Show("OnConnection -- Hallo :-)");
    		}
    
    		public void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom)
    		{
    			MessageBox.Show("OnDisconnection -- ByBy :-)");
    		}
    
    		public void OnStartupComplete(ref Array custom)
    		{
    			MessageBox.Show("OnStartupComplete -- TippTopp :-)");
    		}
    		#endregion
    	}
    }
  6. Dann besorgt man sich folgenden VS2005-KB908002-ENU-x86.EXE fix. Die Thematik des KB interessiert nicht wirklich. Dort drin gibt es eine ganz bestimmtes MSI Packet.
  7. Man führt die EXE aus. Im Ordner C:\Programme\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\KB908002 findet man nun die Datei extensibilityMSM.msi. Und die ist für dieses Problem Gold wert. Ich habe leider keinen anderen Weg gefunden wie man an das MSI kommt.
  8. Auf dem Zielsystem führt man nun das extensibilityMSM.msi aus und anschliessend noch das eigene Setup. 

Danach müsste ein Dialog erscheinen der etwa so aussieht.

image

Es kann aber noch 1000 andere Gründe geben.

– Sind die nötigen .NET Versionen installiert?

– Sind die Office CP/2002 PIA’s installiert?

Jedenfalls habe ich jetzt endlich einen Weg gefunden wie ich das Add-in lauffähig bringe.

Die Assembly Irgendwas, Version=4 … kann nicht gefunden werden.

 Entwicklung, Software  Kommentare deaktiviert für Die Assembly Irgendwas, Version=4 … kann nicht gefunden werden.
Okt 082008
 

Wie oft habe ich nun diese Fehlermeldung schon bekommen. Es ist unglaublich.

Ich portiere zur Zeit ein Office 2003/2007 Add-In, dass mit VSTO entwickelt wurde, nach Office 2002/XP. Dort ist nicht mehr die VSTO aktuell sondern die PIA’s (Primary Interop Assemblies) für Office XP. Im grossen und ganzen wird das Add-In einfach anders geladen. Vor allem darf man mit dem Extensibility.IDTExtensibility2 Interface arbeiten. Den restlichen Code kann man 1 zu 1 übernehmen.

Das Add-In wird im Office als ganz normales COM Add-In registriert und auch als solches behandelt. Genau das verursacht nun diverse Probleme die umschifft werden müssen.

Die .NET Laufzeit sucht in dieser Konstellation die diversen beteiligten Verweise im Ausführungsverzeichnis von der startenden Office-Anwendung. Das ist dann meist im Ordner “C:\Programme\Microsoft Office\Office10”. Dort sind die Assemblies aber nicht vorhanden. Was kann man dagegen tun?

Zum Beispiel hilft diese Datei, die man genau in den besagten Order tut, bei Word schon einiges. Die Datei heisst WINWORD.EXE.config und hat folgenden Inhalt.

<?xml version="1.0"?>
<configuration>
    <startup>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
</configuration>

Das erleichtert einem schon einiges. Die Standard-Assemblies werden so gefunden.

Aber beim BinaryFormatter greift auch das nicht. Hier muss man es anders Lösen.

licenses = (LicenseCollection)formatter.Deserialize(licensestream);

Hier kommt die Meldung, dass die Assembly für den Typ LicenseCollection nicht gefunden werden kann. Das ist dann natürlich sehr ärgerlich.

Hier habe ich dann die Lösung gefunden.

private static void InitializeLicenses()
{
	ResolveEventHandler loadComponentAssembly = new ResolveEventHandler(LoadComponentAssembly);
	AppDomain.CurrentDomain.AssemblyResolve += loadComponentAssembly;

    licenses = new LicenseCollection();

	string licensefilename = 
		Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.
		GetExecutingAssembly().CodeBase), 
		"license.dat").Replace(@"file:\", "");

    if(File.Exists(licensefilename))
    {
		try
		{
			FileStream licensestream = 
				new FileStream(licensefilename, FileMode.Open, FileAccess.Read);
			BinaryFormatter formatter = 
				new BinaryFormatter();

			formatter.AssemblyFormat = 
				System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;

			licenses = (LicenseCollection)formatter.Deserialize(licensestream);
			licensestream.Close();
		}
		catch (Exception ex)
		{}
		finally
		{
			AppDomain.CurrentDomain.AssemblyResolve -= loadComponentAssembly;
		}
    }
    else
    {
        ErrorHandler.LogInfo(1000, "License not found!");
    }
}

static Assembly LoadComponentAssembly(Object sender, ResolveEventArgs args)
{
	string simpleName = args.Name.Substring(0, args.Name.IndexOf(','));
	string assemblyPath = simpleName + ".dll";
	return Assembly.LoadFrom(Path.Combine
				(Path.GetDirectoryName
				(System.Reflection.Assembly.GetExecutingAssembly().CodeBase), 
				assemblyPath).Replace(@"file:\", ""));
}

So wird die Assembly gefunden.

Und wieder ein Problem weniger. Ab zum nächsten. 🙂

VSTO – Transparente Icon’s in den Menüs

 Entwicklung, Software  Kommentare deaktiviert für VSTO – Transparente Icon’s in den Menüs
Aug 142008
 

Ich glaube jeder ist mit mir einig, wenn ich sage, dass hier sieht hässlich aus.

Icons im Menü ohne Transparenz.

Mit VSTO ist es jetzt aber gar nicht mal so einfach transparente Icon’s zu bekommen.

Ein Icon wird einem CommandBarButton (cbc) wie folgt hinzugefügt.

if (item.Icon.Length > 0)
{
	stdole.IPictureDisp pic = GetImage(item.Icon);

	if (pic != null)
	{
		cbc.Picture = pic;
	}
}

GetImage sieht so aus.

private stdole.IPictureDisp GetImage(string imageName)
{
	stdole.IPictureDisp pic = null;
	string file = Path.Combine(iconPath, imageName);
	if (File.Exists(file))
	{
		try
		{
			pic = PictureConverter.
				ImageToPictureDisp(Image.FromFile(file));
		}
		catch (Exception ex)
		{
			//Hier Fehler
		}
	}
	return pic;
}

Und der PictureConverter ist eine eigene Klasse. Findet man überall im Inet.

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace LAG.WordPlus.OfficeAddIns.Word2003
{
	public class PictureConverter : AxHost
	{
		public PictureConverter() : base(string.Empty)
		{
		}
		public static stdole.IPictureDisp ImageToPictureDisp(Image image)
		{
			return (stdole.IPictureDisp)GetIPictureDispFromPicture(image);
		}
		public static stdole.IPictureDisp IconToPictureDisp(Icon icon)
		{
			return ImageToPictureDisp(icon.ToBitmap());
		}
		public static Image PictureDispToImage(stdole.IPictureDisp picture)
		{
			return GetPictureFromIPicture(picture);
		}
	}
}

Wie macht man nun die Icon’s transparent?

Man erweitere das erste Codesnippet um die Zeile 7.

if (item.Icon.Length > 0)
{
	stdole.IPictureDisp pic = GetImage(item.Icon);
	if (pic != null)
	{
		cbc.Picture = pic;
		SetImage(cbc, item.Icon);
	}
}

Der Code für SetImage sieht so aus.

private void SetImage(CommandBarButton button, string icon)
{
	try
	{
		Bitmap bmp = new Bitmap(Path.Combine(iconPath, icon));
		IntPtr Hicon = bmp.GetHicon();
		Icon newIcon = Icon.FromHandle(Hicon);

		ImageList newImageList = new ImageList();
		newImageList.ColorDepth = ColorDepth.Depth8Bit;
		newImageList.ImageSize = new Size(16, 16);
		newImageList.Images.Add(newIcon);

		button.Picture = PictureConverter.
				ImageToPictureDisp(newImageList.Images[0]);
		Bitmap mask = (Bitmap)newImageList.Images[0].Clone();

		for (int x = 0; x < 16; x++)
		{
			for (int y = 0; y < 16; y++)
			{
				mask.SetPixel(x, y, (mask.GetPixel(x, y) 
					== Color.Transparent
					|| mask.GetPixel(x, y).Name == "0") 
					? Color.White : Color.Black);
			}
		}
		button.Mask = PictureConverter.ImageToPictureDisp(mask);
	}
	catch (Exception ex)
	{
		//Fehlerbehandlung
	}
}

Das Ergebnis sieht dann so aus.

Icons im Menü mit Transparenz.

Viel besser. Oder?

Wo markiert man einen Termin als Privat im Outlook 2007?

 Software  Kommentare deaktiviert für Wo markiert man einen Termin als Privat im Outlook 2007?
Nov 082007
 

In Anlehnung an ein Posting von Thomas (Wo sind die Optionen in Office Word 2007?).

Wie markiert man im Outlook 2007 ein Termin als privat.

image 
Für grösser einfach anklicken.

Das erste mal habe ich mich dumm und dämlich gesucht.

es läuft: Clawfinger – A Whole Lot Of Nothing – Simon says

Visio 2007

 Software  Kommentare deaktiviert für Visio 2007
Nov 282006
 

Ups. Auch Visio 2007 scheint noch kein Ribbon zu haben.

Ich dachte eigentlich, dass das ganze Office 2007 mit Ribbon kommen soll.
Kam es vielleicht vorschnell auf den Markt? 🙂

Nov 272006
 

Das muss ich doch gleich mal testen.
Das einrichten ging ja schon mal ganz einfach.
Nur, wie sieht das dann bloss auf dem Liveblog aus? 🙂

Das Hochladen von Bildern muss ich dann noch testen.

Wenn das jetzt gut geht, dann müsste ich nur noch ein zwei
Kleinigkeiten finden um damit sinnvoll zu arbeiten.

Was mir mit Word 2007 sehr entgegenkommt ist die
Rechtschreibkorrektur. 🙂

Was ich jetzt nicht so auf Anhieb gefunden habe ist ein
Technorati Tag Generator.