<?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[[gelöst] OpenOffice COM-Ansteuerung (API?)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe an einem Programm, welches mir Daten über COM/OLE-Ansteuerung von MS Word bzw. OpenOffice im DOC- bzw. ODF-Format ausgeben soll.<br />
Als Wrapper-Klasse für die COM-Ansteuerung verwende ich die von Jochen Kalmbach ( <a href="http://blog.kalmbachnet.de/?postid=63" rel="nofollow">http://blog.kalmbachnet.de/?postid=63</a> ).</p>
<p>Jedoch gibt die OpenOffice-API für C++ geschweige denn für COM-Ansteuerung wenig Hilfen, wie man von Interface zu Interface bzw. zu Methoden kommt bzw. setzt. Ich habe hier in einem Blog ( <a href="http://pn.org/wordpress/?p=18" rel="nofollow">http://pn.org/wordpress/?p=18</a> ) zwar ein paar Grundfunktionen (Öffnen, Speichern,...) gefunden, aber mir ist nicht klar, wie man nach dem Aufrufen der Interfaces auf die Methoden kommt.</p>
<p>Z.B. bekommt man die Writer-Komponente von OpenOffice durch Aufrufen von &quot;createInstance&quot; mit dem Parameter &quot;com.sun.star.frame.Frame&quot;. Nach der API von OpenOffice bekomme ich das Modul &quot;frame&quot; ( <a href="http://api.openoffice.org/docs/common/ref/com/sun/star/frame/module-ix.html" rel="nofollow">http://api.openoffice.org/docs/common/ref/com/sun/star/frame/module-ix.html</a> )<br />
Aber wo finde ich dann in der API den darauffolgenden Aufruf für &quot;loadComponentFromURL&quot;, ohne explizit das Interface XComponentLoader aufzurufen, was in der COM-Ansteuerung nach diesem Beispiel nicht nötig ist?</p>
<p>Und wie bekomme ich nach dem Aufruf von &quot;loadComponentfromURL&quot; die Methode &quot;getText&quot;. Nach der API muß ich auch wieder über Interfaces gehen?</p>
<p>Gibt es da irgendwie eine allgemeine Anleitung, wie man sich am besten durch die API &quot;hangelt&quot;? Denn mit den Java-Bsp. oder der direkten UNO-Ansteuerung kann ich da nicht viel anfangen.</p>
<p>Vielen Dank für eure Hilfe.</p>
<p>Gruß,</p>
<p>Tobias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243884/gelöst-openoffice-com-ansteuerung-api</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Apr 2026 23:02:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243884.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Jun 2009 14:15:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] OpenOffice COM-Ansteuerung (API?) on Fri, 03 Jul 2009 13:47:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe an einem Programm, welches mir Daten über COM/OLE-Ansteuerung von MS Word bzw. OpenOffice im DOC- bzw. ODF-Format ausgeben soll.<br />
Als Wrapper-Klasse für die COM-Ansteuerung verwende ich die von Jochen Kalmbach ( <a href="http://blog.kalmbachnet.de/?postid=63" rel="nofollow">http://blog.kalmbachnet.de/?postid=63</a> ).</p>
<p>Jedoch gibt die OpenOffice-API für C++ geschweige denn für COM-Ansteuerung wenig Hilfen, wie man von Interface zu Interface bzw. zu Methoden kommt bzw. setzt. Ich habe hier in einem Blog ( <a href="http://pn.org/wordpress/?p=18" rel="nofollow">http://pn.org/wordpress/?p=18</a> ) zwar ein paar Grundfunktionen (Öffnen, Speichern,...) gefunden, aber mir ist nicht klar, wie man nach dem Aufrufen der Interfaces auf die Methoden kommt.</p>
<p>Z.B. bekommt man die Writer-Komponente von OpenOffice durch Aufrufen von &quot;createInstance&quot; mit dem Parameter &quot;com.sun.star.frame.Frame&quot;. Nach der API von OpenOffice bekomme ich das Modul &quot;frame&quot; ( <a href="http://api.openoffice.org/docs/common/ref/com/sun/star/frame/module-ix.html" rel="nofollow">http://api.openoffice.org/docs/common/ref/com/sun/star/frame/module-ix.html</a> )<br />
Aber wo finde ich dann in der API den darauffolgenden Aufruf für &quot;loadComponentFromURL&quot;, ohne explizit das Interface XComponentLoader aufzurufen, was in der COM-Ansteuerung nach diesem Beispiel nicht nötig ist?</p>
<p>Und wie bekomme ich nach dem Aufruf von &quot;loadComponentfromURL&quot; die Methode &quot;getText&quot;. Nach der API muß ich auch wieder über Interfaces gehen?</p>
<p>Gibt es da irgendwie eine allgemeine Anleitung, wie man sich am besten durch die API &quot;hangelt&quot;? Denn mit den Java-Bsp. oder der direkten UNO-Ansteuerung kann ich da nicht viel anfangen.</p>
<p>Vielen Dank für eure Hilfe.</p>
<p>Gruß,</p>
<p>Tobias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731038</guid><dc:creator><![CDATA[Sir_Tobias]]></dc:creator><pubDate>Fri, 03 Jul 2009 13:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] OpenOffice COM-Ansteuerung (API?) on Thu, 25 Jun 2009 18:16:39 GMT]]></title><description><![CDATA[<p>Ich verwende folgendes Konstrukt:</p>
<pre><code class="language-cpp">IDispatch* TOpenOffice::DispatchMethod(IDispatch* disp, OLECHAR* funcname,
      DISPPARAMS dispparams, int* okay)
{
  if (!disp || !funcname)
  {
    if (okay) *okay = 0;
    return NULL;
  }

  DISPID id_func;

  disp-&gt;GetIDsOfNames(IID_NULL, &amp;funcname, 1, LOCALE_USER_DEFAULT, &amp;id_func);

  VARIANT result;
  VariantInit(&amp;result);

  IDispatch* ret_value = NULL; // Rückgabewert

  if (disp-&gt;Invoke(id_func, IID_NULL, LOCALE_USER_DEFAULT,
                 DISPATCH_METHOD, &amp;dispparams, &amp;result, NULL, 0) == S_OK)
  {
    if (okay) *okay = 1;
    ret_value = result.pdispVal;
  }
  else
  { // Fehler
    if (okay) *okay = 0;
    VariantClear(&amp;result); // bei Fehler wird result nicht mehr benötigt
  }

  return ret_value;
}
</code></pre>
<p>Wird z.B. folgendermaßen verwendet:</p>
<pre><code class="language-cpp">IDispatch* TOpenOffice::GetBookmarks(IDispatch* document)
{
  // holt eine Referenz auf Bookmarks des Dokumentes

  DISPPARAMS dispparams = {NULL, NULL, 0, 0};
  return DispatchMethod(document, L&quot;getBookmarks&quot;, dispparams, 0);
}
</code></pre>
<p>Das ist zwar mit wxWidgets geschrieben, funktioniert aber analog auch mit BCB. Vielleicht kannst Du ja damit etwas anfangen.</p>
<p>Rob'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1732847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1732847</guid><dc:creator><![CDATA[Rob&#x27;]]></dc:creator><pubDate>Thu, 25 Jun 2009 18:16:39 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] OpenOffice COM-Ansteuerung (API?) on Fri, 26 Jun 2009 05:37:30 GMT]]></title><description><![CDATA[<p>Wenn es keine vernünftige Doku gibt, kannst Du versuchen mit OleView.exe (sollte im VS dabei sein), Dir die TLB anzuschauen... dann siehst Du alle Funktionen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733059</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Fri, 26 Jun 2009 05:37:30 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] OpenOffice COM-Ansteuerung (API?) on Fri, 26 Jun 2009 11:26:59 GMT]]></title><description><![CDATA[<p>BTW: Das COM Interface von Open Office ist eine einzige Katastrophe. Ich habe noch nie ein größeres Chaos gesehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733242</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 26 Jun 2009 11:26:59 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] OpenOffice COM-Ansteuerung (API?) on Fri, 03 Jul 2009 13:47:02 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielen Dank erst mal für die Hilfe.</p>
<p>Ja, das stimmt, sehr übersichtlich ist die COM-Schnittstelle wirklich nicht, zumal oft nicht ersichtlich ist, welches Interface bei einem Funktionsaufruf zurückkommt.</p>
<p>Jedenfalls habe ich noch Schwierigkeiten mit der Funktion &quot;storeAsURL&quot;. Wenn ich sie ausführe, bekomme ich nur die Meldung beim Aufruf von Invoke(...) <strong>&quot;In der Anwendung ist ein Fehler aufgetreten, möchten Sie fortfahren?&quot;.</strong><br />
Dann setzt die Anwendung fort, beim Beenden von OpenOffice erscheint jedoch die Fehlermeldung <strong>R6025: &quot;Pure virtual Function Call&quot;.</strong> Ist mein Aufruf für storeAsURL evtl. falsch?</p>
<p>Hier ist der Aufruf der Funktion. &quot;GetIDsOfNames(...)&quot; funktioniert, &quot;Invoke(...)&quot; jedoch nicht:</p>
<pre><code class="language-cpp">VARIANT vdocName;
   VARIANT vresult;
   vdocName.vt = VT_BSTR;
   //vdocName.bstrVal = SysAllocString(RSCom::RSQStringToBSTR(convertToOOURL(docname)));
   vdocName.bstrVal = SysAllocString(L&quot;file:///C:/Documents/blabla.odt&quot;);
   VARIANT vstoreParam[1];
   VariantInit(&amp;vstoreParam[0]);
   vstoreParam[0].vt = VT_ARRAY | VT_VARIANT;
   vstoreParam[0].parray = NULL;
   if (FAILED(RSCom::Invoke(m_ooDoc, DISPATCH_METHOD, &amp;vresult, NULL, NULL, OLESTR(&quot;storeAsURL&quot;), TEXT(&quot;vv&quot;), vdocName, vstoreParam))) {
      return false;
   }
</code></pre>
<p>Der Pointer m_ooDoc ist vom Typ LPDISPATCH und wird folgendermaßen aufgerufen:</p>
<pre><code class="language-cpp">if (FAILED(RSCom::Invoke(m_ooFrame, DISPATCH_METHOD, &amp;vresult, NULL, NULL, OLESTR(&quot;loadComponentfromURL&quot;), TEXT(&quot;vvvv&quot;), vfileName, vhowOpen, vsearchWindow, vloadParam[0]))) {
      return false;
   }
   m_ooDoc = V_DISPATCH(&amp;vresult);
   m_ooDoc-&gt;AddRef();
</code></pre>
<p>Gelöst: versehentlich wurde ein Array statt eines VARIANT übergeben. Jetzt funktioniert es soweit.</p>
<p>Und als zweites: Wo sehe ich in der API, welches Interface mir &quot;LoadComponentFromURL&quot; zurückgibt? Ist es nur ein Interface XComponent oder schon ein XTextDocument? Die Automatisierungsbeispiele, die ich gesehen habe, waren ganz anders aufgebaut, als man es aus der API rauslesen würde.</p>
<p>Vielen Dank schon mal für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1736545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1736545</guid><dc:creator><![CDATA[Sir_Tobias]]></dc:creator><pubDate>Fri, 03 Jul 2009 13:47:02 GMT</pubDate></item></channel></rss>