Readdy Write  
0,00 €
Your View Money
Views: Count
Self 20% 0
Your Content 60% 0

Users by Links 0
u1*(Content+Views) 10% 0
Follow-Follower 0
s2*(Income) 5% 0

Count
Followers 0
Login Register as User

Gelöst: Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden

14.11.2018 (👁11634)

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() >---------------

}