Simple said I have two programs. One is a EXE and the other is an addin for Word.

If the EXE is called, it starts word and uses functions etc. of the addin.

Maybe some code may help

This is the EXE
VB Code:
  1. '[...]
  2.     Call mAddin.Object.DokumentDazu2(...)
  3.     mAddin.Object.udtExternCalls.item(GetCurrentProcessID).objExternCall = CType(Me.objExternCall, ExternCall)
  4.  
  5.     'mAddin.Object.objThread.Join()
  6.  
  7.     blnAddinCallEnd = False
  8.     blnAddinCallError = False
  9.     blnAddinCallEnd = WaitForProcessCallEnd(blnAddinCallError)
  10.     blnAddinCallEnd = True 'md070503

And this is the addin
VB Code:
  1. Public Function DokumentDazu2(....) As String
  2.     Dim strDatei As String
  3.     Dim udtExternCall As ExternCall
  4.     Try
  5.         Me.blnNewExternCall(intID)
  6.         udtExternCall = Me.udtExternCalls.Item(intID)
  7.         If Not udtExternCall Is Nothing Then
  8.             udtExternCall.blnInParameter = blnVorlageGegeben
  9.             udtExternCall.strInParameter = strNewBlobKey
  10.             udtExternCall.intInParameter = intDruckAnzahl
  11.             System.Threading.Thread.CurrentThread.ApartmentState = System.Threading.ApartmentState.STA
  12.             udtExternCall.objThread = New Threading.Thread(AddressOf DokumentDazuSTA)
  13.             udtExternCall.objThread.ApartmentState = System.Threading.ApartmentState.STA
  14.             udtExternCall.objThread.Name = CStr(intID)
  15.             udtExternCall.objThread.Priority = ThreadPriority.AboveNormal
  16.             udtExternCall.objThread.Start()
  17.         End If
  18.     Catch
  19.         ErrorMessage(...)
  20.     End Try
  21.  
  22.     Return strDatei
  23. End Function
  24.  
  25. Public Sub DokumentDazuSTA()
  26.     Dim strDatei As String
  27.     Dim udtExternCall As ExternCall
  28.     Dim strThreadName As String
  29.     Try
  30.         Call blnCheckApartmentState()
  31.         strThreadName = System.Threading.Thread.CurrentThread.Name
  32.         udtExternCall = Me.udtExternCalls.Item(CInt(strThreadName))
  33.         objThread = System.Threading.Thread.CurrentThread
  34.         If Not udtExternCall Is Nothing Then
  35.             strDatei = mudtSchnittstelle.DokumentDazu(Me, udtExternCall.blnInParameter, udtExternCall.strInParameter, udtExternCall.intInParameter)
  36.             udtExternCall.strOutParameter = strDatei
  37.             udtExternCall.strOutParameter2 = udtExternCall.strInParameter
  38.             udtExternCall.intIDEnd = CInt(strThreadName)
  39.             udtExternCall.blnWordQuit = objIBS_INIT.udtExternCalls.blnWordQuit
  40.             If Not udtExternCall.objExternCall Is Nothing Then
  41.                 udtExternCall.objExternCall.strOutParameter = udtExternCall.strOutParameter
  42.                 udtExternCall.objExternCall.strOutParameter2 = udtExternCall.strOutParameter2
  43.                 udtExternCall.objExternCall.blnWordQuit = udtExternCall.blnWordQuit
  44.                 udtExternCall.objExternCall.intIDEnd = udtExternCall.intIDEnd
  45.             End If
  46.         End If
  47.         Me.udtExternCalls.Delete(CInt(strThreadName))
  48.         DoEvent()
  49.     Catch
  50.         ErrorMessage(...)
  51.     End Try
  52. End Sub

It seems to work, but only on fast computers. I think waiting for the end of the thread started within the addin makes the whole program very slow. I tried a endless loop and thread.join to wait for the end; no difference.

Any idea? I read a lot of monitor and mutex etc. but nothing helps.