<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Von verschiedenen Threads auf Com-Server zugreifen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin gerade dabei einen Corba-Server schreiben der Methoden bereit stellt, welche wiederrum dann auf einen Com-Serve zugreifen. Ich habe nur das Problem das die bereitgestellten Methoden vom Client mit unterschiedlichen Threads aufgerufen werden und ich dann nicht auf das selbe Com-Objekt zugreifen kann. Ich erhalte dann immer eine Exception.</p>
<p>Also Beispiele wären diese Codefragemente...</p>
<p>Datei.h</p>
<p>#import &quot;libid:E60738C2-DEE8-41E3-B538-9306544CB32F&quot; //MyWrapper<br />
CComPtr&lt;MyWrapper&gt; pMyWrapper;</p>
<p>Datei.cpp</p>
<p>//Wird beim starten des Corba-Servers mit aufgerufen<br />
void init()<br />
{<br />
hr = CoInitialize(NULL);</p>
<p>hr=pUnknown.CoCreateInstance(__uuidof(BEISPIELLib: :MyWrapper));</p>
<p>hr=pUnknown-&gt;QueryInterface(&amp;pMyWrapper);</p>
<p>pMyWrapper-&gt;Methode1();<br />
}</p>
<p>//Wird über Corba aufgerufen<br />
void deInit()<br />
{<br />
pMyWrapper-&gt;MEthode2();<br />
}</p>
<p>Ich initialsiere beim starten des Com-Server die Mehtode init, welche dann als Thread läuft.<br />
Wenn ich dann über den Corba-Client die Methode2 aufrufe erhalte ich einen Exception bei pMyWrapper-&gt;Methode2(). Wie kann ich sicherstellen das ich von unterschiedlichen Threads auf das selbe Com-Objekt zugreife?<br />
Hat jemand eine Idee?</p>
<p>Ich habe es bereits mit folgendes versucht...<br />
<a href="http://www.microsoft.com/germany/msd" rel="nofollow">http://www.microsoft.com/germany/msd</a>....mspx?mfr=true</p>
<p>Am Ende der Methode1 gebe ich folgendes ein</p>
<p>CoMarshalInterThreadInterfaceInStream (__uuidof(pMyWrapper), pMyWrapper, &amp;pStream);</p>
<p>und in der Methode2 rufe ich dann gleich beim start</p>
<p>CoGetInterfaceAndReleaseStream (pStream, __uuidof(pMyWrapper), (void**) &amp;pMyWrapper);<br />
Aber auch das bringt nicht.</p>
<p>Gruß<br />
cos</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200249/von-verschiedenen-threads-auf-com-server-zugreifen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 01:20:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200249.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Dec 2007 15:36:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Wed, 12 Dec 2007 15:36:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin gerade dabei einen Corba-Server schreiben der Methoden bereit stellt, welche wiederrum dann auf einen Com-Serve zugreifen. Ich habe nur das Problem das die bereitgestellten Methoden vom Client mit unterschiedlichen Threads aufgerufen werden und ich dann nicht auf das selbe Com-Objekt zugreifen kann. Ich erhalte dann immer eine Exception.</p>
<p>Also Beispiele wären diese Codefragemente...</p>
<p>Datei.h</p>
<p>#import &quot;libid:E60738C2-DEE8-41E3-B538-9306544CB32F&quot; //MyWrapper<br />
CComPtr&lt;MyWrapper&gt; pMyWrapper;</p>
<p>Datei.cpp</p>
<p>//Wird beim starten des Corba-Servers mit aufgerufen<br />
void init()<br />
{<br />
hr = CoInitialize(NULL);</p>
<p>hr=pUnknown.CoCreateInstance(__uuidof(BEISPIELLib: :MyWrapper));</p>
<p>hr=pUnknown-&gt;QueryInterface(&amp;pMyWrapper);</p>
<p>pMyWrapper-&gt;Methode1();<br />
}</p>
<p>//Wird über Corba aufgerufen<br />
void deInit()<br />
{<br />
pMyWrapper-&gt;MEthode2();<br />
}</p>
<p>Ich initialsiere beim starten des Com-Server die Mehtode init, welche dann als Thread läuft.<br />
Wenn ich dann über den Corba-Client die Methode2 aufrufe erhalte ich einen Exception bei pMyWrapper-&gt;Methode2(). Wie kann ich sicherstellen das ich von unterschiedlichen Threads auf das selbe Com-Objekt zugreife?<br />
Hat jemand eine Idee?</p>
<p>Ich habe es bereits mit folgendes versucht...<br />
<a href="http://www.microsoft.com/germany/msd" rel="nofollow">http://www.microsoft.com/germany/msd</a>....mspx?mfr=true</p>
<p>Am Ende der Methode1 gebe ich folgendes ein</p>
<p>CoMarshalInterThreadInterfaceInStream (__uuidof(pMyWrapper), pMyWrapper, &amp;pStream);</p>
<p>und in der Methode2 rufe ich dann gleich beim start</p>
<p>CoGetInterfaceAndReleaseStream (pStream, __uuidof(pMyWrapper), (void**) &amp;pMyWrapper);<br />
Aber auch das bringt nicht.</p>
<p>Gruß<br />
cos</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419461</guid><dc:creator><![CDATA[cos0815]]></dc:creator><pubDate>Wed, 12 Dec 2007 15:36:29 GMT</pubDate></item><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Wed, 12 Dec 2007 20:37:03 GMT]]></title><description><![CDATA[<p>Wenn in dem Programm keine GUI sowie keine ActiveX Komponenten vorkommen dann initialisiere COM einfach mit CoInitializeEx(0, COINIT_MULTITHREADED) (in jedem Thread!), dann kannste COM Interface Pointer einfach von Thread zu Thread weiterreichen und verwenden.</p>
<p>Ansonsten musst du die Interfaces rum-marshallen, z.B. über CoMarshalInterface, CoMarshalInterThreadInterfaceInStream oder den Global Interface Table.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419651</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 12 Dec 2007 20:37:03 GMT</pubDate></item><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Thu, 13 Dec 2007 07:44:31 GMT]]></title><description><![CDATA[<p>Funktioniert das mit dem CoInitializeEx(0, COINIT_MULTITHREADED); auch mit Com-Servern die als singlethreaded entwickelt worden sind?</p>
<p>Denn ich binde 3 Com-Server ein (3 DLLs). Und bei bei einem mache ich beim QueryInterface so...</p>
<pre><code>IMyModule* m_module = NULL;	
IMyLogger* m_logger = NULL;

hr = pMyJob-&gt;QueryInterface(__uuidof(IMyModule),(void**)&amp;m_module);
if(hr == S_OK)
{
  cout &lt;&lt; &quot;MyJob: QueryInterface erfolgreich&quot; &lt;&lt; endl;
}
</code></pre>
<p>Da erhalte ich aber immer ein E_NOINTERFACE.<br />
Bei den anderen beiden geht es. Da übergebe ich dem QueryInterface aber auch nur __uuidof(IxyzJob).</p>
<p>Eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419761</guid><dc:creator><![CDATA[cos08151]]></dc:creator><pubDate>Thu, 13 Dec 2007 07:44:31 GMT</pubDate></item><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Thu, 13 Dec 2007 09:55:13 GMT]]></title><description><![CDATA[<p>Und wie könnte ich dann den Com-Interface-Pointer weitergeben?</p>
<p>Außerdem habe ich das mit dem CoInitializeEx versucht.</p>
<p>hr = CoInitialize(NULL); //das geht auch mit dem 3 com-Server<br />
hr = CoInitializeEx(0, COINIT_MULTITHREADED); //!das hier nicht!<br />
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); //das geht euch mit dem 3 com-Server</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419762</guid><dc:creator><![CDATA[cos0815]]></dc:creator><pubDate>Thu, 13 Dec 2007 09:55:13 GMT</pubDate></item><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Fri, 14 Dec 2007 02:20:06 GMT]]></title><description><![CDATA[<blockquote>
<p>Funktioniert das mit dem CoInitializeEx(0, COINIT_MULTITHREADED); auch mit Com-Servern die als singlethreaded entwickelt worden sind?</p>
</blockquote>
<p>Jain. Wenn der Prozess der CoInitializeEx(0, COINIT_MULTITHREADED) macht nur Client von Komponenten ist die als singlethreaded (apartment-threaded) entwickelt worden sind dann funktioniert es oft aber nicht immer. Ein Beispiel für wo es nicht geht sind die meisten ActiveX Komponenten (ActiveX == apartment-threaded). Wenn dagegen der Code dieser Komponenten in einem neuen Server &quot;neu verpackt&quot; wird kann man auf keinen Fall einfach COINIT_MULTITHREADED - der Code der &quot;alten&quot; Komponenten würde damit wohl kaum klarkommen.</p>
<p>Aber... wenn du mit CoInitializeEx(NULL, COINIT_MULTITHREADED) Probleme hast dann würde ich vorschlagen erstmal CoInitialize zu lassen, denn auf anderem Wege lässt sich das Problem vermutlich schneller lösen.</p>
<p>BTW: CoInitialize(NULL) und CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) sind äquivalent, ist egal welches von beiden du nimmst. Daher auch nicht weiter verwunderlich dass es bei dir dasselbe Verhalten zeigt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Soviel zu COINIT_MULTITHREADED.</p>
<p>----</p>
<blockquote>
<p>(...) Da erhalte ich aber immer ein E_NOINTERFACE.</p>
</blockquote>
<p>Erstmal: bist du sicher dass das Interface auch implementiert ist, denn E_NOINTERFACE deutet eher darauf hin dass es nix mit Threading zu tun hat, sondern das Interface einfach ... nicht implementiert ist.</p>
<p>Davon abgesehen: aus welchem Thread rufst du pMyJob-&gt;QueryInterface auf? &quot;OK&quot; ist es nur wenn es der gleiche Thread ist der auch das Interface in pMyJob &quot;auf legalem Weg&quot; erstanden hat. Also entweder über CoCreateInstance oder über einen anderen Aufruf auf ein Interface welches diesem Thread geöhrt. Oder auf einem der anderen &quot;legalen&quot; Wege (Marshaling z.B.).</p>
<p>Wenn du aber ein Interface in Thread A bekommst (woher auch immer) und in Thread B verwenden willst dann musst du es &quot;marshal-en&quot;. Der einfachste mir bekannte Weg ist über den Global Interface Table. Sieht inetwa so aus:</p>
<pre><code class="language-cpp">DWORD MarshalFooInGIT(IFoo* foo) // &quot;foo&quot; muss für den Thread der dashier aufruft natürlich erstmal gültig sein
{
    DWORD cookie = 0;

    IGlobalInterfaceTable git = 0;
    HRESULT hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void**) &amp;git);

    if (SUCCEEDED(hr))
    {
        // OK, wir haben das Interface auf den GIT
        hr = git-&gt;RegisterInterfaceInGlobal(foo,IID_IFoo, &amp;cookie);
        if (SUCCEEDED(hr))
        {
            // OK, wir haben das interface im GIT registriert
            assert(cookie != 0);
        }
        else
            cookie = 0;

        git-&gt;Release();
    }

    return cookie;
}

// Solange du das Interface im GIT registriert lässt kannst du das cookie nun rumreichen,
// quasi als &quot;handle&quot; auf das Interface.
// &quot;Rausholen&quot; kannst du das Interface mit dem Cookie so:

void UseFoo(DWORD fooCookie) // kannst du aus einem beliebigen Thread aufrufen, solange dieser *irgendwie* COM initialisiert hat
                            // (CoInitialize, CoInitializeEx oder zur Not OleInitialize)
{
    IGlobalInterfaceTable git = 0;
    HRESULT hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void**) &amp;git);

    if (SUCCEEDED(hr))
    {
        // OK, wir haben das Interface auf den GIT
        IFoo* foo = 0;
        hr = git-&gt;GetInterfaceFromGlobal(fooCookie, IID_IFoo, (void**) &amp;foo);
        if (SUCCEEDED(hr))
        {
            // OK, wir haben das IFoo interface :) :)
            foo-&gt;FOOOOO();
            foo-&gt;Release(); // müssen wir freigeben, standard COM Regeln (was wir &quot;getten&quot; müssen wir auch &quot;releasen&quot;)
        }
        git-&gt;Release();
    }
}

// Und &quot;rauslöschen&quot; aus dem GIT geht so:
bool RemoveFooFromGIT(DWORD fooCookie) // kannst du AFAIK auch aus einem beliebigen Thread aufrufen solange dieser COM initialisiert hat
{
    IGlobalInterfaceTable git = 0;
    HRESULT hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void**) &amp;git);

    if (SUCCEEDED(hr))
    {
        hr = git-&gt;RevokeInterfaceFromGlobal(fooCookie);
        git-&gt;Release();
    }

    return SUCCEEDED(hr);
}
</code></pre>
<p>Ich übernehme keine Garantie für den Code da oben, hab das einfach so hier reingetippt, aber inetwa so geht das. (Ich hab' das schonmal nach dem Schema verwendet und hat funktioniert, also weit daneben kanns nicht sein, bloss hab ich den Code von damals jetzt nicht hier).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420278</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 14 Dec 2007 02:20:06 GMT</pubDate></item><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Fri, 14 Dec 2007 11:57:02 GMT]]></title><description><![CDATA[<p>Hallo Hustbaer,</p>
<p>danke für die Infos. D.h. wenn bei mir das mit dem CoInitializeEx(Null, Multithreaded) nicht funktioniert muss ich es marshallen und CoInitialize(Null) verwenden. Richtig?<br />
Und wenn ich drei Com-Server habe muss ich für jeden den einen Cookie machen und diese dann rumreichen.<br />
Das QueryInterface rufe ich übrigens aus dem Corba-Server aus auf. Dieser initialisiert dann alles und dann ruft der Corba-Client aus der selben Klasse verschiedene Methoden auf die Methoden des Com-Servers aufrufen.<br />
Ich werde das aber testen und wenns nicht klappt melde ich mich nochmal.<br />
Aber erstmal Danke.</p>
<p>Gruß<br />
cos</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420472</guid><dc:creator><![CDATA[cos0815]]></dc:creator><pubDate>Fri, 14 Dec 2007 11:57:02 GMT</pubDate></item><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Fri, 14 Dec 2007 14:36:30 GMT]]></title><description><![CDATA[<p>So ist es!<br />
Ich würde übrigends immer marshallen.<br />
Wenn später aus technischen Gründen auf free theaded umgestellt wird, mach dies keinen Nachteil. Es kostet keine Zeit, weil einfach der Zeiger aus der GIT returniert wird ohne Overhead.<br />
Muss man sein Konzept aber später in ein STA Modell zwängen ist es gut, wenn immer schon gemarshallt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1420573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1420573</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 14 Dec 2007 14:36:30 GMT</pubDate></item><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Sun, 16 Dec 2007 11:28:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche das gerade mit dem Cookie, aber wenn ich mir die Daten aus dem Cookie hole bleibt mein Programm stehen.<br />
Zur Info. Ich initialisere den Com-Server im Corba-Server jetzt so...</p>
<pre><code>hr = CoInitialize(NULL);

	//MyWrapper
	hr=pUnknown.CoCreateInstance(__uuidof(MyWrapper)); 

  //als CComPtr&lt;IAsamWrapper&gt; pMyWrapper; in der *.h deklariert
	hr=pUnknown-&gt;QueryInterface(&amp;pMyWrapper); 

	//in der selben Methode mache ich das hier; also selber Thread
	cookie = 0; //Im Header deklariert: DWORD cookie;
	git = 0; //Im Header deklariert: IGlobalInterfaceTable* git;

	HRESULT hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void**) &amp;git);

	// OK, wir haben das Interface auf den GIT
	hr = git-&gt;RegisterInterfaceInGlobal(pMyWrapper,__uuidof(MyWrapper), &amp;cookie);
	if (SUCCEEDED(hr))
	{
		// OK, wir haben das interface im GIT registriert
		assert(cookie != 0);
	}
	else
		cookie = 0;

	git-&gt;Release();
</code></pre>
<p>die beiden anderen Com-Server werden in der selben Methode initialsiert. Kann ich da dann den selben Cookie nehmen? Oder wäre es besser wenn ich einfach cookie1, cookie2 und cookie3 anlegen würden?</p>
<p>Im Com Corba-Client rufe ich eine andere Methode auf mit folgenden Inhalt:</p>
<pre><code>CoInitialize(NULL);

git = 0;
HRESULT hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void**) &amp;git);

if (SUCCEEDED(hr))
{
  CComPtr&lt;IMyWrapper&gt; pMyWrapper = 0;
  // OK, wir haben das Interface auf den GIT
  hr = git-&gt;GetInterfaceFromGlobal(cookie, __uuidof(MyWrapper), (void**) &amp;pMyrapper);
  if (SUCCEEDED(hr))
  {

	   hr = pMyWrapper-&gt;DeInit();
  }
  git-&gt;Release();
}
</code></pre>
<p>und bei git-&gt;GetInterfaceFromGlobal bleibt mein Server und Client einfach stehen. Ohne Fehlermeldung.</p>
<p>Woran liegt das? Was mache ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421298</guid><dc:creator><![CDATA[cos0815]]></dc:creator><pubDate>Sun, 16 Dec 2007 11:28:16 GMT</pubDate></item><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Sun, 16 Dec 2007 18:24:03 GMT]]></title><description><![CDATA[<p>1.) Dass du den GIT jedesmal neu anlegst und freigibst ist schonmal richtig, nur würde ich eine lokale Variable dafür verwenden, keine globale. Sonst kommen sich wieder verschiedene Threads beim Zugriff darauf in die Quere.</p>
<p>2.) Natürlich musst du wenn du 3 Sachen in den GIT steckst auch 3 Cookies verwenden - das Cookie ist ja sozusagen das &quot;Handle&quot; auf das Interface.</p>
<p>Die beiden Punkte sind IMO falsch und gehören korrigiert. Allerdings hab' ich diese Fehler auch nie gemacht und kann daher nicht sagen ob das &quot;Stehenbleiben&quot; daran liegt oder an etwas anderem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421520</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 16 Dec 2007 18:24:03 GMT</pubDate></item><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Mon, 17 Dec 2007 07:13:58 GMT]]></title><description><![CDATA[<p>Ich verwende im Moment erstmal nur &quot;einen&quot; Com-Server, also auch nur einen Cookie und habe habe nun auch den git als lokale Variabele initalisiert. Kann der Fehler auch daran liegen das ich dne git so initialisiere?</p>
<p>IGlobalInterfaceTable* git = 0;</p>
<p>Denn wenn ich einen Zeige verwende erhalte ich beim Übersetzen einen Fehler....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421773</guid><dc:creator><![CDATA[cos0815]]></dc:creator><pubDate>Mon, 17 Dec 2007 07:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to Von verschiedenen Threads auf Com-Server zugreifen on Mon, 17 Dec 2007 08:22:57 GMT]]></title><description><![CDATA[<p>Du musst jedes Interface über die GIT marschallen.<br />
Das hängt nicht davon ab ob dies ein Server ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421802</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 17 Dec 2007 08:22:57 GMT</pubDate></item></channel></rss>