<?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[Struktur-Array übergeben, Fehler: SAFEARRAY erwartet]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine C++ Dll die eine <a href="http://VB.Net" rel="nofollow">VB.Net</a> DLL aufruft, das klappt mit Parametern vom Typ String und Integer ganz gut.<br />
Nun habe ich eine Struktur definiert und will ein Array dieser Strukturen aus C++ an die .Net DLL übergeben. (Was in der Struktur drin ist, ist mir vorerst egal.)</p>
<p>Aufruf der <a href="http://VB.NET" rel="nofollow">VB.NET</a> DLL aus der C++ DLL:</p>
<pre><code class="language-cpp">#import &quot;ManagedDLL.tlb&quot; raw_interfaces_only
using namespace ManagedDLL;

void myFunction(myStructure **args)
{
    HRESULT hr = CoInitialize(NULL); // Initialize COM.
    ICalculatorPtr pICalc(__uuidof(ManagedClass)); // Create the interface pointer.

    pICalc-&gt;DotNetFunction(args);// Call the method.

    CoUninitialize(); // Uninitialize COM.
}
</code></pre>
<p>Die Funktion in <a href="http://VB.NET" rel="nofollow">VB.NET</a> die das Array aufnimmt sieht so aus:</p>
<pre><code>Public Sub DotNetFunction(ByRef args() As myStructure) Implements ICalculator.MainCallFunction
End Sub
</code></pre>
<p>Nun kriege ich folgenden Fehler (Problem 1):</p>
<blockquote>
<p>&gt; error C2664: 'ManagedDLL::ICalculator::MainCallFunction': Konvertierung des Parameters 1 von 'ManagedDLL::myStructure **' in 'SAFEARRAY **' nicht möglich</p>
</blockquote>
<p>Wenn ich dagegen kein Array sondern einfach nur die Struktur übergeben möchte (also *args), lässt sich das Projekt ohne Fehler erstellen.</p>
<p>Hier der Aufruf:</p>
<pre><code class="language-cpp">void Call_DotNet_Method()
{
	myStructure arg;
	arg.Type = (ManagedDLL::enType)1; // Typ:Integer_ 
	arg.Value.Integer_ = 4;
	myFunction(&amp;arg);
}
</code></pre>
<p>Die .Net-Funktion wird ausgeführt, ich kann auch auf die übergebene Struktur zugreifen.</p>
<p>Aber: nach dem die Funktion beendet wurde stürzt die C++ Entwicklungsumgebung nach ca. 3 Sekunden ab, ohne dass die nächste Zeile in C++ nach dem Funktionsaufruf (pICalc-&gt;DotNetFunction(args); ) ausgeführt wird.</p>
<p>Ich habe keine Ahnung warum aufeinmal ein SAFEARRAY erwartet wird wenn ich ein myStruct-Array übergebe.<br />
Aber bei der Ursache für den Absturz vermute ich, dass ich aufgrund meiner Unwissenheit irgendetwas bei den Zeigern vermasselt hab.</p>
<p>Ich bin auch für andere Vorschläge offen, wie z.B. die Struktur in C++ zu definieren, wenn ich sie dann in .Net nutzen kann.</p>
<p>Vielen Dank fürs Lesen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/226219/struktur-array-übergeben-fehler-safearray-erwartet</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 02:57:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226219.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Oct 2008 18:23:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Struktur-Array übergeben, Fehler: SAFEARRAY erwartet on Thu, 30 Oct 2008 18:23:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine C++ Dll die eine <a href="http://VB.Net" rel="nofollow">VB.Net</a> DLL aufruft, das klappt mit Parametern vom Typ String und Integer ganz gut.<br />
Nun habe ich eine Struktur definiert und will ein Array dieser Strukturen aus C++ an die .Net DLL übergeben. (Was in der Struktur drin ist, ist mir vorerst egal.)</p>
<p>Aufruf der <a href="http://VB.NET" rel="nofollow">VB.NET</a> DLL aus der C++ DLL:</p>
<pre><code class="language-cpp">#import &quot;ManagedDLL.tlb&quot; raw_interfaces_only
using namespace ManagedDLL;

void myFunction(myStructure **args)
{
    HRESULT hr = CoInitialize(NULL); // Initialize COM.
    ICalculatorPtr pICalc(__uuidof(ManagedClass)); // Create the interface pointer.

    pICalc-&gt;DotNetFunction(args);// Call the method.

    CoUninitialize(); // Uninitialize COM.
}
</code></pre>
<p>Die Funktion in <a href="http://VB.NET" rel="nofollow">VB.NET</a> die das Array aufnimmt sieht so aus:</p>
<pre><code>Public Sub DotNetFunction(ByRef args() As myStructure) Implements ICalculator.MainCallFunction
End Sub
</code></pre>
<p>Nun kriege ich folgenden Fehler (Problem 1):</p>
<blockquote>
<p>&gt; error C2664: 'ManagedDLL::ICalculator::MainCallFunction': Konvertierung des Parameters 1 von 'ManagedDLL::myStructure **' in 'SAFEARRAY **' nicht möglich</p>
</blockquote>
<p>Wenn ich dagegen kein Array sondern einfach nur die Struktur übergeben möchte (also *args), lässt sich das Projekt ohne Fehler erstellen.</p>
<p>Hier der Aufruf:</p>
<pre><code class="language-cpp">void Call_DotNet_Method()
{
	myStructure arg;
	arg.Type = (ManagedDLL::enType)1; // Typ:Integer_ 
	arg.Value.Integer_ = 4;
	myFunction(&amp;arg);
}
</code></pre>
<p>Die .Net-Funktion wird ausgeführt, ich kann auch auf die übergebene Struktur zugreifen.</p>
<p>Aber: nach dem die Funktion beendet wurde stürzt die C++ Entwicklungsumgebung nach ca. 3 Sekunden ab, ohne dass die nächste Zeile in C++ nach dem Funktionsaufruf (pICalc-&gt;DotNetFunction(args); ) ausgeführt wird.</p>
<p>Ich habe keine Ahnung warum aufeinmal ein SAFEARRAY erwartet wird wenn ich ein myStruct-Array übergebe.<br />
Aber bei der Ursache für den Absturz vermute ich, dass ich aufgrund meiner Unwissenheit irgendetwas bei den Zeigern vermasselt hab.</p>
<p>Ich bin auch für andere Vorschläge offen, wie z.B. die Struktur in C++ zu definieren, wenn ich sie dann in .Net nutzen kann.</p>
<p>Vielen Dank fürs Lesen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607389</guid><dc:creator><![CDATA[a98]]></dc:creator><pubDate>Thu, 30 Oct 2008 18:23:20 GMT</pubDate></item></channel></rss>