<?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[Funktionen, die als String vorliegen aufrufen]]></title><description><![CDATA[<p>Ich weiß, der Titel ist blöd, man kann das Problem nicht in eine Zeile fassen.</p>
<p>Folgendes:</p>
<p>Ich habe verschiedene Headerdateien einer dll. Zum Beispiel</p>
<p>Header.hpp</p>
<pre><code class="language-cpp">...
LIntExport Herror decode_2d_bar_code(const HTuple&amp;,const HTuple&amp;,const HTuple&amp;);
LIntExport Herror get_2d_bar_code_pos(const Hobject&amp;,const Hobject&amp;,);
LIntExport Herror find_2d_bar_code(const Hobject&amp;,Hobject*);
LIntExport Herror gen_2d_bar_code_descr(const HTuple&amp;,const HTuple&amp;,HTuple*);
LIntExport Herror discrete_1d_bar_code(const HTuple&amp;,const HTuple&amp;,HTuple*);
...
</code></pre>
<p>Daraus hole ich mir für jede Funktion den Namen, Rückgabewert und die Parameter. Die habe ich also als Strings schon vorliegen.</p>
<p>Wenn ich jetzt in meinem Programm eine dieser Funktionen auswähle, möchte ich sie aufrufen. Ich hatte mir das so in etwa vorgestellt:</p>
<p>dll-wrapper.cpp</p>
<pre><code class="language-cpp">// In argc steht die Anzahl der Strings, die ich übergebe.
// argv hat etwa folgenden Aufbau: func_name, return_value, param_type_1, 
// param_1, param_type_2, param_2, .., param_type_n, param_n
void call_dll_function(int argc, int argv[])
{
    // Zuerst werden die Parameter ausgewertet (Typ und Wert)
    if(param_typ == &quot;unsigned char&quot;) {
        ...
    }

    // Wenn ich alles hingebogen habe, möchte ich die entsprechende Funktion 
    // jetzt aufrufen und das Ergebnis zurückliefern
    ???
}
</code></pre>
<p>Ich hoffe, ich konnte rüberbringen, was ich machen möchte. Die einzelnen Funktionen hardcoden geht nicht, da es jetzt schon über 800 sind und sich ständig ändern können.</p>
<p>Hat jemand einen Vorschlag, wie man das realisieren könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/147966/funktionen-die-als-string-vorliegen-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 11:23:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/147966.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 May 2006 08:49:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionen, die als String vorliegen aufrufen on Mon, 22 May 2006 08:50:24 GMT]]></title><description><![CDATA[<p>Ich weiß, der Titel ist blöd, man kann das Problem nicht in eine Zeile fassen.</p>
<p>Folgendes:</p>
<p>Ich habe verschiedene Headerdateien einer dll. Zum Beispiel</p>
<p>Header.hpp</p>
<pre><code class="language-cpp">...
LIntExport Herror decode_2d_bar_code(const HTuple&amp;,const HTuple&amp;,const HTuple&amp;);
LIntExport Herror get_2d_bar_code_pos(const Hobject&amp;,const Hobject&amp;,);
LIntExport Herror find_2d_bar_code(const Hobject&amp;,Hobject*);
LIntExport Herror gen_2d_bar_code_descr(const HTuple&amp;,const HTuple&amp;,HTuple*);
LIntExport Herror discrete_1d_bar_code(const HTuple&amp;,const HTuple&amp;,HTuple*);
...
</code></pre>
<p>Daraus hole ich mir für jede Funktion den Namen, Rückgabewert und die Parameter. Die habe ich also als Strings schon vorliegen.</p>
<p>Wenn ich jetzt in meinem Programm eine dieser Funktionen auswähle, möchte ich sie aufrufen. Ich hatte mir das so in etwa vorgestellt:</p>
<p>dll-wrapper.cpp</p>
<pre><code class="language-cpp">// In argc steht die Anzahl der Strings, die ich übergebe.
// argv hat etwa folgenden Aufbau: func_name, return_value, param_type_1, 
// param_1, param_type_2, param_2, .., param_type_n, param_n
void call_dll_function(int argc, int argv[])
{
    // Zuerst werden die Parameter ausgewertet (Typ und Wert)
    if(param_typ == &quot;unsigned char&quot;) {
        ...
    }

    // Wenn ich alles hingebogen habe, möchte ich die entsprechende Funktion 
    // jetzt aufrufen und das Ergebnis zurückliefern
    ???
}
</code></pre>
<p>Ich hoffe, ich konnte rüberbringen, was ich machen möchte. Die einzelnen Funktionen hardcoden geht nicht, da es jetzt schon über 800 sind und sich ständig ändern können.</p>
<p>Hat jemand einen Vorschlag, wie man das realisieren könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062568</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Mon, 22 May 2006 08:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen, die als String vorliegen aufrufen on Mon, 22 May 2006 09:02:38 GMT]]></title><description><![CDATA[<p>Wenn alle Funktionen die selbe Parameterliste hätten, könntest du dir einen entsprechenden Funktionspointer definieren und dir per LoadLibrary und GetProcAdress() die passende Funktion besorgen.</p>
<p>Ansonsten solltest du mal erklären, was du eigentlich dort vorhast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062577</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 22 May 2006 09:02:38 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen, die als String vorliegen aufrufen on Mon, 22 May 2006 09:13:32 GMT]]></title><description><![CDATA[<p>Ich weiß, ist ganz schön verworren die Aufgabe.</p>
<p>Sinn und Zweck:</p>
<p>Die Libraries, die vorliegen sind Bildverarbeitungsroutinen. Mit vielen hundert Funktionen. Ich möchte (oder besser muss) nun aus LabVIEW (grafische Prog-Sprache) zur Laufzeit heraus dynamisch auf diese Funktionen zugreifen. In LabVIEW soll ein User alle verfügbaren Funktionen angezeigt bekommen und sich diese nach belieben aneinanderreihen. DLL-Funktionen werden in LabVIEW in einem Call-Library-Node aufgerufen. Da stellt man die Funktion ein, die Parameter und so weiter. Leider kann man das nicht dynamisch zur Laufzeit ändern.<br />
Wenn ich alle DLL-Funktionen nicht hardcoden möchte, brauche ich einen Mechanismus, der mir die Dinger dynamisch identifiziert und aufruft. Ich dachte halt, dass ich im LabVIEW immer nur eine Funktion aufrufe (meinen dll-Wrapper), der dann die Aufrufe an die Bibliotheken weiterleitet.<br />
Denn in LabVIEW geht es halt wie gesagt nicht. Deswegen wollte ich das in C/C++ auslagern.</p>
<p>Leider sind die Parameterlisten auch nicht identisch. Mal gibts 3 Parameter, mal 27. Immer mit den verschiedensten Datentypen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062584</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Mon, 22 May 2006 09:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen, die als String vorliegen aufrufen on Mon, 22 May 2006 09:32:10 GMT]]></title><description><![CDATA[<p>Du brauchst schon eine einheitliche Parameterübergabe, da du ja dann eine konkrete Funktion mit entsprechenden Parametern aufrufen mußt. Die verschiedenen Funktionsnamen sind nicht das Problem, da wie schon geschrieben, diese der Funktion &quot;LoadLibrary&quot; bzw. &quot;GetProcAddress&quot; übergeben werden, aber den Rückgabewert mußt du dann auf einen passenden Funktionsprototypen casten, z.b.</p>
<pre><code class="language-cpp">const char *cFuncname = &quot;myfunc&quot;; // oder als Parameter

typedef void (*MyFunc)(int, unsigned char, const char *);

HINSTANCE hInstLib = LoadLibrary(&quot;libname&quot;);

MyFunc func = (MyFunc)GetProcAddress(hInstLib, cFuncname);
if(func)
   (*func)(0, 'x', &quot;hello&quot;); // oder hier auch wieder dynamische Werte, aber die Anzahl der Parameter mußt du fest coden
</code></pre>
<p>Eine andere Möglichkeit wäre, wenn du direkt den Aufrufstack erzeugst und die entsprechende Funktion dann aufrufst (am besten in Assembler).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062601</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 22 May 2006 09:32:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen, die als String vorliegen aufrufen on Mon, 22 May 2006 09:35:04 GMT]]></title><description><![CDATA[<p>hm... also zusammengefasst: du hast eine oder mehrere Dlls mit verschiedenen Funktionen, die auch alle verschiedene Parameter erwarten?<br />
Und die willst in deinem Programm mittels einer Funktion wie</p>
<p>CallDll(string fnName, parameterliste...)</p>
<p>diese funktionen aus der Dll aufrufen?</p>
<p>das is übel, glaubich..</p>
<p>Ich denke, dir bleibt nichts anderes übrig, als (wenigstens die Funktionsnamen mit parameterliste hardzucoden.)</p>
<p>Ich würde dann glaub ich versuchen, für jede funktion eine Klasse zu schreiben, die genau diese funktion wrappt, oder eine Klasse für alle Funktionen, die die dinger wrappt, so dass du dann sozusagen die Klasse als funktion hast, den Rest macht die Klasse für sich. Die Klassen müssen aber trotzdem wissen, wie ihre Funktion heißt und welche Parameter die erwartet. Und die muss dann auch mittels GetProcAddress den Funktionspointer aus der Dll laden... aber so müsste es gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062604</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Mon, 22 May 2006 09:35:04 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen, die als String vorliegen aufrufen on Mon, 22 May 2006 09:36:42 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Eine andere Möglichkeit wäre, wenn du direkt den Aufrufstack erzeugst und die entsprechende Funktion dann aufrufst (am besten in Assembler).</p>
</blockquote>
<p>das is ne coole Idee, aber da musst due die aufrufkonventionen kennen und so, da kann auch mehr schiefgehen als mit loadlibrary und co</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062606</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Mon, 22 May 2006 09:36:42 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen, die als String vorliegen aufrufen on Mon, 22 May 2006 09:51:25 GMT]]></title><description><![CDATA[<p>Das ist in dem Fall nicht nur ne coole Idee, sondern die einzige saubere Lösung (ohne Neuschreiben von sehr viel Code).<br />
Die Aufrufkonvention rauszufinden ist ja kein Problem.</p>
<p>Wenn du mal wieder sowas hast, dann wäre es einfacher die Funktionen in einer Skriptsprache wie LUA zu schreiben, dann ist das ganze kein Problem <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/1062627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062627</guid><dc:creator><![CDATA[Dr. Prof]]></dc:creator><pubDate>Mon, 22 May 2006 09:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen, die als String vorliegen aufrufen on Mon, 22 May 2006 10:18:43 GMT]]></title><description><![CDATA[<p>Mmh, also das mit dem Aufrufstack muss ich mir dann mal anschauen. Gibts da gute Links oder Doku dazu?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/2470">@Maxi</a><br />
Die Sache mit den extra-Klassen für jede Funktion wollte ich gerade vermeiden. Denn in der jetzigen Bibliothek sind 6981 Funktionen. Und es ist durchaus möglich, dass die Bibliothek demnächst getauscht wird. Sonst könnte ich es auch im LabVIEW hardcoden.</p>
<p>Wie ich mir schon dachte, ist die Aufgabe ziemlich Hardcore... Mal schauen, ob ich irgendwie einen Weg finde.</p>
<p>Erstmal Danke an alle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062650</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Mon, 22 May 2006 10:18:43 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen, die als String vorliegen aufrufen on Mon, 22 May 2006 10:27:16 GMT]]></title><description><![CDATA[<p>Steht dir der Sourcecode von dieser Labview-Sprache zur Verfügung? Weil dann kannst du einfach ein Languagebinding programmieren. manche benutzen dafür auch Boosts Sprachbinder, damit wurde schon Python und Ruby an C++ mittels Boost gebunden.</p>
<p>Das Problem an der ganzen Thematik (hat jetzt nichts speziell mit Boost zu tun) ist, das du sehr viel zu Fuss erledigen mußt, damit deine API auf beiden Seiten angesprochen werden kann. Das wirst du mit drei Zeilen C++ Code nicht hinbekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062654</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Mon, 22 May 2006 10:27:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen, die als String vorliegen aufrufen on Mon, 22 May 2006 10:31:41 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Steht dir der Sourcecode von dieser Labview-Sprache zur Verfügung?</p>
</blockquote>
<p>Nee, dass ist ne professionelle Programmiersprache (4000 € pro Lizenz) für den technischen Bereich. Bin wegen Firmenpolitik leider darauf angewiesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062657</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Mon, 22 May 2006 10:31:41 GMT</pubDate></item></channel></rss>