Gelöst: Thread muss der STA-Modus
(Single Thread Apartment) festgelegt werden
Problem:
Beim Verwenden der Windows Zwischenablage Clipboard in einer
Addin Anwendung für Word kommt die Meldung, dass das Clipboard nicht als STA Thread
deklariert ist.
Source-Code mit Fehler:
Aktuell wird im Programm eine verkleinerte Bitmap aus einem
Foto erzeugt, welche dann in die Zwischenablage gelegt werden soll.
Image outImage = new Bitmap(source_Bitmap, new_Width, new_Height);
Clipboard.SetImage(outImage);
//*Error with STA
|
Lösung:
Man muss einen neuen Thread für den Vorgang öffnen und mit
Start und Join ausführen.
Hier im Code-Besipiel wird ein neuer Thread erzeugt und ausgeführt.
new Thread((ThreadStart)(() => {
Problem-Code }));
|
Komplettes Code-Beispiel
Bitte beachten: der Thread muss als SetApartmentStart mit STA
eingestellt werden und dann mit .Start gestartet werden.
Image outImage = new Bitmap(source_Bitmap, new_Width, new_Height);
var t = new Thread((ThreadStart)(() =>
{
Clipboard.SetImage(outImage);
}));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
|
Betrifft:
C# in
Windows Forms, WPF, Aufruft Clipboard in VSTO Word Intercom Addin
Fehlermeldung:
Message=Für den aktuellen Thread
muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor
OLE-Aufrufe ausgeführt werden können.
Stellen Sie sicher, dass die
Hauptfunktion mit STAThreadAttribute gekennzeichnet ist.
System.Threading.ThreadStateException
HResult=0x80131520
Message=Für den aktuellen Thread
muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor
OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die
Hauptfunktion mit STAThreadAttribute gekennzeichnet ist.
Source=word_Addin_03_Photos
StackTrace:
at
Addin_Word_Photos_into_Table.Ribbon1.load_Photo_compressed_to_Clipboard(String
input_Image_Path, Int32 setLength) in ..
|
Lösung:
Beispiel
Code
Mit
public static void load_Photo_compressed_to_Clipboard(string input_Image_Path, int setLength)
{
//---------------< Image_resize() >---------------
Bitmap source_Bitmap = new Bitmap(input_Image_Path);
double dblWidth_origial = source_Bitmap.Width;
double dblHeigth_origial = source_Bitmap.Height;
//< check orientation >
bool IsOrientation_Horizontal = (dblWidth_origial > dblHeigth_origial) ? true : false;
//</ check orientation >
int new_Height = 0;
int new_Width = 0;
double zoom_factor = 1;
if (IsOrientation_Horizontal == true)
{
new_Width = setLength;
zoom_factor = new_Width / dblWidth_origial;
new_Height = (int)(dblHeigth_origial * zoom_factor);
}
else
{
new_Height = setLength;
zoom_factor = new_Height / dblHeigth_origial;
new_Width = (int)(dblWidth_origial * zoom_factor);
}
Image outImage = new Bitmap(source_Bitmap, new_Width, new_Height);
var t = new Thread((ThreadStart)(() =>
{
Clipboard.SetImage(outImage);
}));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
//---------------</ Image_resize() >---------------
}
|