<?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[Bearbeiten eines Arrays durch eine C++ DLL]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgendes Problem:<br />
Ich möchte eine DLL schreiben (mit MS VC++6), die von VB6 einige Arrays übergeben bekommt und dann damit rechnet.<br />
Im Moment verwende ich ein Beispiel-Projekt von <a href="http://www.vbpc.de" rel="nofollow">http://www.vbpc.de</a> UseDLL.<br />
Wenn ich nun die DLL in VB aufrufe mit</p>
<pre><code>dim Array(1000) as single
		dim ZweitesArray(1000) as single
		dim Zahl1 as byte
		dim Zahl2 as byte
		dim Ergebnis as integer

		Ergebnis = USEDLL_test(&quot;test&quot;, Array(0), ZweitesArray(0), Zahl1, Zahl2)
</code></pre>
<p>So funktioniert der Aufruf und die DLL tut etwas, z.B. Ergebnis = Zahl1 + Zahl2</p>
<p>Möchte ich mit folgendem Code ein Array lesen oder verändern, so kommt es zu einem Fehler</p>
<pre><code class="language-cpp">int USEDLL_test (char *t,
			float *p_F,
			int *p_A,
			unsigned char loops,
			unsigned char Verst)
	{			
			int Element = 0;

			cout&lt;&lt;p_F[0]&lt;&lt;endl;   
			cout&lt;&lt;p_F[1]&lt;&lt;endl;
			cout&lt;&lt;p_F[2]&lt;&lt;endl;

			int Element = 3;
			p_F[Element] = 13;
			Element++;
			p_F[Element] = 27;

			cout&lt;&lt;p_F[3]&lt;&lt;endl;
			cout&lt;&lt;p_F[4]&lt;&lt;endl;

	return(loops+Verst);
	}
</code></pre>
<p>Es gibt folgende Fehlermeldung:</p>
<p>vb6.exe - Fehler in Anwendung<br />
(Roter Kreis mit Kreuz, also Error) Die Anwendung in &quot;000172100e&quot; verweist auf Speicher in &quot;0x042480000&quot;. Der Vorgang &quot;read&quot; konnte nicht auf dem Speicher durchgeführt werden.</p>
<p>Klicken Sie ok zum beenden (vb6 ist dann weg)<br />
Abbrechen zum debuggen (Möglichkeit mit Just In Time Debuggen vb6.exe zu untersuchen)</p>
<p>Entfernt man alle Zeilen die p_F lesen oder schreiben, so funktioniert der Code. Evtl. machen die Cout alleine schon einen Fehler in einer DLL, jedoch auch wenn das Cout Zeug deaktiviert ist, macht der p_F[Element] = 13 Teil die Fehlermeldung.<br />
Zum Testen habe ich den Code auch in ein C++ Projekt eingebaut. Die MainFunction</p>
<pre><code class="language-cpp">Ergebnis = USEDLL_test (&quot;test&quot;, Array, ArrayZwei,Zahl1,Zahl2);
</code></pre>
<p>ruft die Funktion in dem Projekt auf. Bei gleichem Code funktioniert der Schnipsel oben.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/45073/bearbeiten-eines-arrays-durch-eine-c-dll</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 22:21:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/45073.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Aug 2003 16:38:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bearbeiten eines Arrays durch eine C++ DLL on Wed, 06 Aug 2003 16:38:13 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgendes Problem:<br />
Ich möchte eine DLL schreiben (mit MS VC++6), die von VB6 einige Arrays übergeben bekommt und dann damit rechnet.<br />
Im Moment verwende ich ein Beispiel-Projekt von <a href="http://www.vbpc.de" rel="nofollow">http://www.vbpc.de</a> UseDLL.<br />
Wenn ich nun die DLL in VB aufrufe mit</p>
<pre><code>dim Array(1000) as single
		dim ZweitesArray(1000) as single
		dim Zahl1 as byte
		dim Zahl2 as byte
		dim Ergebnis as integer

		Ergebnis = USEDLL_test(&quot;test&quot;, Array(0), ZweitesArray(0), Zahl1, Zahl2)
</code></pre>
<p>So funktioniert der Aufruf und die DLL tut etwas, z.B. Ergebnis = Zahl1 + Zahl2</p>
<p>Möchte ich mit folgendem Code ein Array lesen oder verändern, so kommt es zu einem Fehler</p>
<pre><code class="language-cpp">int USEDLL_test (char *t,
			float *p_F,
			int *p_A,
			unsigned char loops,
			unsigned char Verst)
	{			
			int Element = 0;

			cout&lt;&lt;p_F[0]&lt;&lt;endl;   
			cout&lt;&lt;p_F[1]&lt;&lt;endl;
			cout&lt;&lt;p_F[2]&lt;&lt;endl;

			int Element = 3;
			p_F[Element] = 13;
			Element++;
			p_F[Element] = 27;

			cout&lt;&lt;p_F[3]&lt;&lt;endl;
			cout&lt;&lt;p_F[4]&lt;&lt;endl;

	return(loops+Verst);
	}
</code></pre>
<p>Es gibt folgende Fehlermeldung:</p>
<p>vb6.exe - Fehler in Anwendung<br />
(Roter Kreis mit Kreuz, also Error) Die Anwendung in &quot;000172100e&quot; verweist auf Speicher in &quot;0x042480000&quot;. Der Vorgang &quot;read&quot; konnte nicht auf dem Speicher durchgeführt werden.</p>
<p>Klicken Sie ok zum beenden (vb6 ist dann weg)<br />
Abbrechen zum debuggen (Möglichkeit mit Just In Time Debuggen vb6.exe zu untersuchen)</p>
<p>Entfernt man alle Zeilen die p_F lesen oder schreiben, so funktioniert der Code. Evtl. machen die Cout alleine schon einen Fehler in einer DLL, jedoch auch wenn das Cout Zeug deaktiviert ist, macht der p_F[Element] = 13 Teil die Fehlermeldung.<br />
Zum Testen habe ich den Code auch in ein C++ Projekt eingebaut. Die MainFunction</p>
<pre><code class="language-cpp">Ergebnis = USEDLL_test (&quot;test&quot;, Array, ArrayZwei,Zahl1,Zahl2);
</code></pre>
<p>ruft die Funktion in dem Projekt auf. Bei gleichem Code funktioniert der Schnipsel oben.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/325747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/325747</guid><dc:creator><![CDATA[Simon2000]]></dc:creator><pubDate>Wed, 06 Aug 2003 16:38:13 GMT</pubDate></item><item><title><![CDATA[Reply to Bearbeiten eines Arrays durch eine C++ DLL on Wed, 06 Aug 2003 16:49:00 GMT]]></title><description><![CDATA[<p>Bist du den sicher ob ein &quot;dim Array(1000) as single&quot; in seinem aufbau identisch mit einem float *p_F?<br />
Weist du ob das BasicKonstrukt Array(0) identisch ist mir einem C-Pointer auf ein Array?</p>
<p>Wir haben vor zwei Jahren auch Versuche gemacht, mit VC 6 und VB, allerdigns mit der Übergabe von strings und sind gescheitert.</p>
<p>Soloange du bei fundamentalen Typen scheint es zu funktionieren, sobald amn auf Ziegertypen, Feldtypen und Strukturen<br />
übergeht scheint es Unterschiede in der internen Darstellung der Daten zu geben, die es zumindes schwierig machen.</p>
<p>Laäßt sich deine Fundstelle zu solchen Fragen irgendwie aus.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Mixed Language Programming ist ein sehr interessantes Thema, das wir hier ruhig diskutieren sollten.<br />
Auch ich hätte da noch einen Informationsbedarf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/325749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/325749</guid><dc:creator><![CDATA[PAD]]></dc:creator><pubDate>Wed, 06 Aug 2003 16:49:00 GMT</pubDate></item><item><title><![CDATA[Reply to Bearbeiten eines Arrays durch eine C++ DLL on Wed, 06 Aug 2003 19:29:12 GMT]]></title><description><![CDATA[<p>Tja also mit einem String hab ich keine Probleme.<br />
Mit Ergebnis = USEDLL_test(&quot;test&quot;,...)<br />
übergebe ich einen String an meine DLL, der dann durch<br />
UseDLL(char *t, ... mit einem Pointer aufgenommen wird und dann durch Cout&lt;&lt;t&lt;&lt;endl; verarbeitet wird.<br />
Auch die Übergabe einer einzelnen Single/Float Zahl funktioniert:<br />
Bsp:<br />
dim Array(1000) as single<br />
Ergebnis = USEDLL_test(&quot;test&quot;,Array(0),...)</p>
<p>und</p>
<pre><code class="language-cpp">UseDLL(char *t, float F,...)
</code></pre>
<p>funktioniert, jedoch habe ich dann nur eine Zahl und kein Array.</p>
<p>Die MitDemMesserDurchDenRücken-Methode währe nun ein float *p_F = &amp;F und dann<br />
p_F[Element] = Wert</p>
<p>Jedoch muss das doch auch besser gehen.<br />
Ich vermute, dass das Problem folgendes ist: VB übergibt einen den Wert an der pos = Array(Element) und nur diesen, C++ erwartet jedoch einen Pointer auf den ersten Wert von dem übergebenen Array. Bei String wird StringNULL von VB übergeben. Jetzt müsste man erfahren wie man VB zur Übergebe eines ganzen Arrays bringt. (off-topic?)<br />
Hat das schon mal wer gemacht?<br />
Ich habe für USB eine fertige DLL der man mit USB(Array(0),4) einen Wert, bzw. einen Index auf das erste Element übergibt. Diese liest dann auch die nächsten (4) Elemente.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/325840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/325840</guid><dc:creator><![CDATA[Simon2000]]></dc:creator><pubDate>Wed, 06 Aug 2003 19:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to Bearbeiten eines Arrays durch eine C++ DLL on Wed, 06 Aug 2003 19:31:46 GMT]]></title><description><![CDATA[<p>Ähm, zu der Frage...<br />
Also meine Funstelle lässt sich über Pointer und Arrays nicht aus. Nur eben ein String und Zahlen vom Typ double werden als Beispiel übergeben.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/325844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/325844</guid><dc:creator><![CDATA[Simon2000]]></dc:creator><pubDate>Wed, 06 Aug 2003 19:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to Bearbeiten eines Arrays durch eine C++ DLL on Wed, 06 Aug 2003 20:13:53 GMT]]></title><description><![CDATA[<p>Strings der kam zwar im C an und konnte dort ausgegeben werden, wurde der String allerdings in<br />
C- bearbeitet und zurückgeliefert, so kam es ab und zu (allerdings nicht nachvollziehbar) Fehlern<br />
in den letzten Zeichen, sah fast wie eine Alignment Problem aus konnte aber durch geändertes<br />
Alignment nicht korrigiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/325862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/325862</guid><dc:creator><![CDATA[PAD]]></dc:creator><pubDate>Wed, 06 Aug 2003 20:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to Bearbeiten eines Arrays durch eine C++ DLL on Thu, 07 Aug 2003 05:05:13 GMT]]></title><description><![CDATA[<p>Dein Ansatz mit der DLL ist ungeschickt, weil Du im Aufbau der DLL sehr viele interne Details aus C++ einbaust, die Du dann beim Aufruf von VB beachten mußt. Z.B. kannst Du die Typen völlig frei wählen, das macht es natürlich fehleranfällig.</p>
<p>Die richtige Lösung wäre in C++ ein COM-Objekt zu schreiben - durch die Interface-Definition-Language (IDL) sind nämlich dann alle Typen definiert und austauschbar. In VB ziehst Du das Objekt dann einfach in Dein Projekt rein und die Übergabe aller Werte klappt sofort. Du kannst das mal mit den Assistenten vom VStudio testen, einfache COM-Server lassen sich dort via Assistent fast automatisch generieren. Das Ergebnis bindest Du in einem VB-Projekt ein.</p>
<p>Ach ja, lass Dich nicht täuschen daß dieses Ergebnis auch in einer DLL erzeugt wird... es ist trotzdem etwas anders als die bisher von Dir verwendete DLL.</p>
<p>Ich denke mal, in der Rubrik MFC sitzen die geeigneten Fachleute für diese Herangehensweise... ich schiebe das dorthin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/325993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/325993</guid><dc:creator><![CDATA[Marc++us]]></dc:creator><pubDate>Thu, 07 Aug 2003 05:05:13 GMT</pubDate></item><item><title><![CDATA[Reply to Bearbeiten eines Arrays durch eine C++ DLL on Thu, 07 Aug 2003 07:13:07 GMT]]></title><description><![CDATA[<p>Es gibt eine Datei &quot;Vb5dll.doc&quot; (mal googlen) in der ist beschrieben wie Daten von VB -&gt; C/C++ übergeben werden können. Auch Strukuren (keine Klassen). Die o.g. Datei ist auch auf irgendeiner VB-CD mit drauf, weiß aber grad nicht welche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/326045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/326045</guid><dc:creator><![CDATA[Frank ll]]></dc:creator><pubDate>Thu, 07 Aug 2003 07:13:07 GMT</pubDate></item></channel></rss>