<?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[COM-Interface ausgebremst]]></title><description><![CDATA[<p>Hat jemand eine Idee, wie man ein MFC-Programm mit COM-Interface auf eine Rückmeldung von einem anderen Programm über eben dieses Interface warten lassen kann, ohne das Interface selbst stillzulegen?</p>
<p>Konkret sieht das so aus: Ich habe ein Programm, das mit von CDocument abgeleiteten Dateien arbeitet. CDoc enthält diverse Properties und Methods, die über die Type-Library von einem externen VB-Programm angesprochen werden. Das funktioniert im Prinzip auch einwandfrei.</p>
<p>Nun wird vom MFC-Programm unmittelbar vor dem Speichern ein VB-Programm aufgerufen, das wiederum über das Interface diverse Daten eintragen soll, bevor vom MFC-Programm tatsächlich gespeichert wird. Bei Aufruf des externen Programms per <strong>_spawnl(P_WAIT,...)</strong> ist aber auch das Interface tot und kann nicht vom VB.exe angesprochen werden. Bei Aufruf per <strong>_spawnl(P_NOWAIT,...)</strong> legt das MFC.exe naturgemäß sofort mit dem Speichern los, bevor VB.exe auch nur das Interface aktivieren kann. Wenn VB.exe dann Daten einträgt, ist das Speichern längst erledigt. <strong>ShellExecute()</strong> oder <strong>ShellExecuteEx()</strong> statt spawnl() kommt im Prinzip auf's Gleiche raus.</p>
<p>Jetzt habe ich probehalber in IDocument einen Property-Wert eingebaut, der vor dem _spawnl(P_NOWAIT,...) vom MFC-Programm auf &quot;Abwarten&quot; gesetzt und solange abgefragt wird, bis er vom VB-Programm auf &quot;Weitermachen&quot; gesetzt wird. Eine Endlosschleife mit ständig wiederholter Abfrage dieses Werts würde natürlich den ganzen Rechner ausbremsen. Ein Versuch mit Abgabe des Timeslice per <strong>SleepEx(sekunden,TRUE)</strong> oder <strong>SleepEx(0,TRUE)</strong> legt aber auch das Interface und damit beide Programme lahm. Jetzt frage ich mich verzweifelt, wie man das MFC-Programm mit minimaler CPU-Last auf der Stelle treten, aber das COM-Interface am Leben lassen kann.</p>
<p>Der Aufruf des VB-Programms kann jedenfalls erst erfolgen, wenn vom Benutzer das Speichern angefordert wurde, also aus <strong>CDoc::OnSaveDocument()</strong> oder <strong>CDoc::OnFileSave()</strong>. Also bleibt mir auch nichts anderes übrig, als hier auf eine wie auch immer geartete Rückmeldung des VB-Programms zu warten. Oder hab' ich da einen grundsätzlichen Denkfehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/45526/com-interface-ausgebremst</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 00:58:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/45526.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Aug 2003 12:41:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to COM-Interface ausgebremst on Mon, 11 Aug 2003 12:41:01 GMT]]></title><description><![CDATA[<p>Hat jemand eine Idee, wie man ein MFC-Programm mit COM-Interface auf eine Rückmeldung von einem anderen Programm über eben dieses Interface warten lassen kann, ohne das Interface selbst stillzulegen?</p>
<p>Konkret sieht das so aus: Ich habe ein Programm, das mit von CDocument abgeleiteten Dateien arbeitet. CDoc enthält diverse Properties und Methods, die über die Type-Library von einem externen VB-Programm angesprochen werden. Das funktioniert im Prinzip auch einwandfrei.</p>
<p>Nun wird vom MFC-Programm unmittelbar vor dem Speichern ein VB-Programm aufgerufen, das wiederum über das Interface diverse Daten eintragen soll, bevor vom MFC-Programm tatsächlich gespeichert wird. Bei Aufruf des externen Programms per <strong>_spawnl(P_WAIT,...)</strong> ist aber auch das Interface tot und kann nicht vom VB.exe angesprochen werden. Bei Aufruf per <strong>_spawnl(P_NOWAIT,...)</strong> legt das MFC.exe naturgemäß sofort mit dem Speichern los, bevor VB.exe auch nur das Interface aktivieren kann. Wenn VB.exe dann Daten einträgt, ist das Speichern längst erledigt. <strong>ShellExecute()</strong> oder <strong>ShellExecuteEx()</strong> statt spawnl() kommt im Prinzip auf's Gleiche raus.</p>
<p>Jetzt habe ich probehalber in IDocument einen Property-Wert eingebaut, der vor dem _spawnl(P_NOWAIT,...) vom MFC-Programm auf &quot;Abwarten&quot; gesetzt und solange abgefragt wird, bis er vom VB-Programm auf &quot;Weitermachen&quot; gesetzt wird. Eine Endlosschleife mit ständig wiederholter Abfrage dieses Werts würde natürlich den ganzen Rechner ausbremsen. Ein Versuch mit Abgabe des Timeslice per <strong>SleepEx(sekunden,TRUE)</strong> oder <strong>SleepEx(0,TRUE)</strong> legt aber auch das Interface und damit beide Programme lahm. Jetzt frage ich mich verzweifelt, wie man das MFC-Programm mit minimaler CPU-Last auf der Stelle treten, aber das COM-Interface am Leben lassen kann.</p>
<p>Der Aufruf des VB-Programms kann jedenfalls erst erfolgen, wenn vom Benutzer das Speichern angefordert wurde, also aus <strong>CDoc::OnSaveDocument()</strong> oder <strong>CDoc::OnFileSave()</strong>. Also bleibt mir auch nichts anderes übrig, als hier auf eine wie auch immer geartete Rückmeldung des VB-Programms zu warten. Oder hab' ich da einen grundsätzlichen Denkfehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/329322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/329322</guid><dc:creator><![CDATA[josch]]></dc:creator><pubDate>Mon, 11 Aug 2003 12:41:01 GMT</pubDate></item><item><title><![CDATA[Reply to COM-Interface ausgebremst on Mon, 11 Aug 2003 13:40:20 GMT]]></title><description><![CDATA[<p>CreateProcess und WaitForSingleObjects sind deine Freunde... benutz mal die Suchfunktion hier und im winAPI-Forum...</p>
<p>Eigentlich funktioniert ShellExecuteEx und WaitForSingleObject auch schon ganz gut. (Siehe VCL FAQ bzw. Forum oder bestimmt auch im WinAPI Forum.)</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/329376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/329376</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Mon, 11 Aug 2003 13:40:20 GMT</pubDate></item><item><title><![CDATA[Reply to COM-Interface ausgebremst on Mon, 11 Aug 2003 20:50:16 GMT]]></title><description><![CDATA[<p>Danke, das hat mir schon auf die Sprünge geholfen. <strong>WaitForSingleObject(...)</strong> hat zwar in diesem Fall wegen hinterrücks über's Interface aufgerufener Dialoge prompt auch geklemmt, aber kaum hat man stundenlang daran herumgefummelt, schon funktioniert's ...</p>
<p><strong>WaitForInputIdle(...)</strong> nach dem Anwerfen und anschließend <strong>MsgWaitForMultipleObjectsEx(...)</strong> waren schließlich des Rätsels Lösung. Auch wenn man nur einen Processhandle, also eigentlich doch nur &quot;single object&quot; hat, ist es ganz nützlich, wenn man sich sämtliche Events für den Abbruch bzw. Unterbrechung der Warterei einzeln aussuchen kann. Die mussten dann nur noch per Peek- und PumpMessage() weitergeleitet werden, um das Interface am Leben zu halten. Wenn man's weiß, isses ganz einfach - und manchmal ganz nützlich, wegen doch nicht so ganz allmächtiger MFC mal wieder im WinAPI zu stochern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/329651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/329651</guid><dc:creator><![CDATA[josch]]></dc:creator><pubDate>Mon, 11 Aug 2003 20:50:16 GMT</pubDate></item></channel></rss>