<?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 und Speicherverwaltung (CoTaskMemAlloc vs new)]]></title><description><![CDATA[<p>Hi,</p>
<p>also ich denke mal es gibt hier bestimmt einige COM-Spezis die mir da evtl. weiterhelfen können...</p>
<p>1.) Wenn man <strong>innerhalb</strong> eines COM-Objektes Speicher alloziiert und diesen an den Client gibt, sollte man das ja grundsätzlich mit CoTaskMemAlloc machen, richtig oder?</p>
<p>2.) Wenn man das innerhalb eines COM-Objektes tut, aber man genau weiß, dass der Client auch ein C++ Client ist (auch derselbe Compiler, also z.B. MSVC8), kann man eigentlich auch auf CoTaskMemAlloc verzichten und genauso gut new verwenden, auch richtig?</p>
<p>3.) Und das ist eigentlich meine eigentliche Frage:<br />
Angenommen ich habe eine einfache C-Funktion (welche ich in einem COM-Objekt kapseln will), z.B. so:</p>
<pre><code class="language-cpp">void func(char** ppData, int* pDataLen) {...}
</code></pre>
<p>Der C-Aufrufer benutzt die Funktion dann so:</p>
<pre><code class="language-cpp">int nDataLen = 10;
char* pData = new char[nDataLen];
func(&amp;pData, &amp;nDataLen);
...
</code></pre>
<p>In der Funktion &quot;func&quot; können dann in den übergebenen Speicherbereich irgendwelche Daten geschrieben werden, oder wenn der übergebene Speicherbereich zu klein ist, wird dieser einfach erst gelöscht und dann neu allokert und dann kommen die Daten rein. Wichtig ist halt, dass der <strong>Aufrufer(Client) eigentlich zuerst Speicher bereitstellt</strong>, und dieser dann erst bei Bedarf in der Funktion func gelöscht/neu allokiert wird.</p>
<p>Wenn ich diese Funktionalität jetzt in einem COM-Objekt bereitstelle, muss ich für die Speicherreservierung dann auch CoTaskMemAlloc verwenden, oder würde es new auch tun? (vorrausgesetzt, dass ich dieses COM-Objekt dann auch in anderen Sprachen wie VB,C#, usw... benutzen will)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194756/com-und-speicherverwaltung-cotaskmemalloc-vs-new</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Apr 2026 21:59:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194756.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Oct 2007 15:30:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to COM und Speicherverwaltung (CoTaskMemAlloc vs new) on Wed, 10 Oct 2007 15:32:27 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>also ich denke mal es gibt hier bestimmt einige COM-Spezis die mir da evtl. weiterhelfen können...</p>
<p>1.) Wenn man <strong>innerhalb</strong> eines COM-Objektes Speicher alloziiert und diesen an den Client gibt, sollte man das ja grundsätzlich mit CoTaskMemAlloc machen, richtig oder?</p>
<p>2.) Wenn man das innerhalb eines COM-Objektes tut, aber man genau weiß, dass der Client auch ein C++ Client ist (auch derselbe Compiler, also z.B. MSVC8), kann man eigentlich auch auf CoTaskMemAlloc verzichten und genauso gut new verwenden, auch richtig?</p>
<p>3.) Und das ist eigentlich meine eigentliche Frage:<br />
Angenommen ich habe eine einfache C-Funktion (welche ich in einem COM-Objekt kapseln will), z.B. so:</p>
<pre><code class="language-cpp">void func(char** ppData, int* pDataLen) {...}
</code></pre>
<p>Der C-Aufrufer benutzt die Funktion dann so:</p>
<pre><code class="language-cpp">int nDataLen = 10;
char* pData = new char[nDataLen];
func(&amp;pData, &amp;nDataLen);
...
</code></pre>
<p>In der Funktion &quot;func&quot; können dann in den übergebenen Speicherbereich irgendwelche Daten geschrieben werden, oder wenn der übergebene Speicherbereich zu klein ist, wird dieser einfach erst gelöscht und dann neu allokert und dann kommen die Daten rein. Wichtig ist halt, dass der <strong>Aufrufer(Client) eigentlich zuerst Speicher bereitstellt</strong>, und dieser dann erst bei Bedarf in der Funktion func gelöscht/neu allokiert wird.</p>
<p>Wenn ich diese Funktionalität jetzt in einem COM-Objekt bereitstelle, muss ich für die Speicherreservierung dann auch CoTaskMemAlloc verwenden, oder würde es new auch tun? (vorrausgesetzt, dass ich dieses COM-Objekt dann auch in anderen Sprachen wie VB,C#, usw... benutzen will)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382195</guid><dc:creator><![CDATA[nep]]></dc:creator><pubDate>Wed, 10 Oct 2007 15:32:27 GMT</pubDate></item><item><title><![CDATA[Reply to COM und Speicherverwaltung (CoTaskMemAlloc vs new) on Wed, 10 Oct 2007 18:20:00 GMT]]></title><description><![CDATA[<p>Wenn du Sprachen wie C#/VB/... verwenden willst sollte das Interface sowieso &quot;automation compatible&quot; sein, sonst wird das &quot;nicht lustig (tm)&quot;.</p>
<p>Und solche rohen Zeiger sind IIRC nicht &quot;automation compatible&quot; sobald sie auf mehr als ein Element zeigen. (Bzw. auch Zeiger auf Zeiger sind nicht &quot;automation compatible&quot; wenn der primäre und/oder sekundäre Zeiger auf mehr als ein Objekt zeigt.)</p>
<p>Eine Möglichkeit wäre BSTRs zu verwenden, mit SysAllocStringByteLen o.ä. Übergeben würdest du dann einen &quot;[in, out] BSTR*&quot;, und die Funktion könnte den alten BSTR falls nötig freigeben und durch einen neuen ersetzen.</p>
<p>Eine andere Möglichkeit wären variant arrays/safearrays.</p>
<p>Noch eine andere Möglichkeit wären Streams (IStream, ggf. mit CreateStreamOnHGlobal einen &quot;Memory-Stream&quot; anlegen).<br />
Allerdings: ich weiss nicht ob IStream funktioniert wenn der Interface Pointer zwischen Apartments/Prozessen/Systemen gemarshalt wird -- denke eher nicht. Weiss also nicht ob das so eine gute Idee ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1382315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1382315</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 10 Oct 2007 18:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to COM und Speicherverwaltung (CoTaskMemAlloc vs new) on Thu, 11 Oct 2007 22:06:39 GMT]]></title><description><![CDATA[<p>Joa dass das mit den Zeigern auf Zeigern böse wird dachte ich mir schon fast. Aber geht hier leider nicht anders.<br />
Aber es ist sogar in der Tat so, dass es fast ausschließlich immer um C-Strings geht, welche halt eben bei Bedarf auch wachsen.<br />
Wenn ich das jetzt richtig verstanden habe, dann ist das okay wenn ich einen BSTR* als in/out als Parameter habe. Innerhalb der Implementierung der COM-Funktion kann ich dann ja meinen eigenen Speicher anlegen benutzen und damit meine alte C Funktion aufrufen. Das Ergebnis könnte ich dann ja in meinen BSTR Parameter kopieren. Sehe ich richtig oder?<br />
Aber wenn das COM-Objekt auch von C#,VB und so benutzt werden soll, dann muss ich sowas wie SysAllocString/CoTaskMemAlloc verwenden oder?</p>
<p>SAFEARRAYS verwende ich bei ein paar anderen Dingen bei mir auch schon... Aber wenn ich grad dabei bin... können die nachträglich noch wachsen? Ne oder?</p>
<p>Danke auf jeden Fall schon mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1383276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1383276</guid><dc:creator><![CDATA[nep]]></dc:creator><pubDate>Thu, 11 Oct 2007 22:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to COM und Speicherverwaltung (CoTaskMemAlloc vs new) on Fri, 12 Oct 2007 15:25:50 GMT]]></title><description><![CDATA[<p>Yo, ich würde da einfach SysAllocString/SysAllocStringLen/SysAllocStringByteLen verwenden.</p>
<p>SysAllocString wenn der &quot;Quellstring&quot; nullterminiert ist und &quot;Text&quot; enthält,<br />
SysAllocStringLen wenn der &quot;Quellstring&quot; nicht nullterminiert ist aber auch &quot;Text&quot; enthält,<br />
und SysAllocStringByteLen wenn der &quot;Quellstring&quot; keinen Text enthält sondern irgendwelche Binärdaten die du 1:1 so rumreichen willst (d.h. wo eine Konvertierung nach UNICODE so garnicht erwünscht ist).</p>
<blockquote>
<p>Innerhalb der Implementierung der COM-Funktion kann ich dann ja meinen eigenen Speicher anlegen benutzen und damit meine alte C Funktion aufrufen.</p>
</blockquote>
<p>Jo, genau.</p>
<blockquote>
<p>Das Ergebnis könnte ich dann ja in meinen BSTR Parameter kopieren. Sehe ich richtig oder?</p>
</blockquote>
<p>Mit dem Ergebnis kannst du dann SysAllocStringXxx aufrufen. Dann gibst du den alten BSTR frei (SysFreeString), und überschreibst ihn mit dem neuen BSTR.</p>
<blockquote>
<p>SAFEARRAYS verwende ich bei ein paar anderen Dingen bei mir auch schon... Aber wenn ich grad dabei bin... können die nachträglich noch wachsen? Ne oder?</p>
</blockquote>
<p>Da bin ich im Moment überfragt.<br />
Falls nicht könnte es immernoch mit einem Zeiger auf ein variant-array/safearray gehen -- also quasi gleich wie mit dem BSTR.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1383890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1383890</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 12 Oct 2007 15:25:50 GMT</pubDate></item><item><title><![CDATA[Reply to COM und Speicherverwaltung (CoTaskMemAlloc vs new) on Fri, 12 Oct 2007 17:15:25 GMT]]></title><description><![CDATA[<p>Also nur mal so zum Topic, hab ich grade gesehen: SAFEARRAYs können nicht dynamisch wachsen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1383974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1383974</guid><dc:creator><![CDATA[nep]]></dc:creator><pubDate>Fri, 12 Oct 2007 17:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to COM und Speicherverwaltung (CoTaskMemAlloc vs new) on Fri, 12 Oct 2007 20:20:19 GMT]]></title><description><![CDATA[<p>nep schrieb:</p>
<blockquote>
<p>Also nur mal so zum Topic, hab ich grade gesehen: SAFEARRAYs können nicht dynamisch wachsen.</p>
</blockquote>
<p>Können sie doch:<br />
<a href="http://msdn2.microsoft.com/en-us/library/ms221002.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms221002.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1384094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384094</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 12 Oct 2007 20:20:19 GMT</pubDate></item></channel></rss>