<?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[Ich bin in der DLL Hell :-(]]></title><description><![CDATA[<p>Ich versuche mit den Borland C++ Builder ein .dll zu erstellen, welche jeder (auch im Visual Studio) verwenden kann.</p>
<p>Die .dll und ein Testprogramm unter Borland funktionieren optimal. Leider kann ich die .dll nicht im VS aufrufen. Der .DLL Export Viewer zeigt, dass aus meiner Funktion</p>
<pre><code class="language-cpp">__declspec(dllexport) __stdcall int  GetTestInt(void){return 44;};
</code></pre>
<p>@GetTestInt$qqvs<br />
wurde.</p>
<p>Bei den Compiler-Settings habe ich unter Output u. Source nichts angeklickt und Language compliance = Borland (alle anderen gehen nicht).</p>
<p>Im VS bekomme ich mit LoadLibrary einen pointer aber GetProcAddress liefert NULL, egal ob ich es mit GetTestInt oder @GetTestInt$qqvs aufrufe.</p>
<p>Q: Wie kann muss ich die .dll gestalten damit die Schnittstellen nicht <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3683">@xxx</a>$qqvs haben sondern den wirklichen Funktionsnamen. (Ich nehme an, dass dann auch der Aufruf unter VS geht).</p>
<p>Danke,<br />
Mario</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/125181/ich-bin-in-der-dll-hell</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 04:50:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/125181.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 04 Nov 2005 08:28:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 08:28:06 GMT]]></title><description><![CDATA[<p>Ich versuche mit den Borland C++ Builder ein .dll zu erstellen, welche jeder (auch im Visual Studio) verwenden kann.</p>
<p>Die .dll und ein Testprogramm unter Borland funktionieren optimal. Leider kann ich die .dll nicht im VS aufrufen. Der .DLL Export Viewer zeigt, dass aus meiner Funktion</p>
<pre><code class="language-cpp">__declspec(dllexport) __stdcall int  GetTestInt(void){return 44;};
</code></pre>
<p>@GetTestInt$qqvs<br />
wurde.</p>
<p>Bei den Compiler-Settings habe ich unter Output u. Source nichts angeklickt und Language compliance = Borland (alle anderen gehen nicht).</p>
<p>Im VS bekomme ich mit LoadLibrary einen pointer aber GetProcAddress liefert NULL, egal ob ich es mit GetTestInt oder @GetTestInt$qqvs aufrufe.</p>
<p>Q: Wie kann muss ich die .dll gestalten damit die Schnittstellen nicht <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3683">@xxx</a>$qqvs haben sondern den wirklichen Funktionsnamen. (Ich nehme an, dass dann auch der Aufruf unter VS geht).</p>
<p>Danke,<br />
Mario</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907834</guid><dc:creator><![CDATA[Stoana]]></dc:creator><pubDate>Fri, 04 Nov 2005 08:28:06 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 08:40:05 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Versuchst mal so</p>
<pre><code class="language-cpp">extern &quot;C&quot; __declspec(dllexport) int  GetTestInt(void){return 44;};
</code></pre>
<p>Dann wird die Funktion mit einer C-Signatur exportiert und die Parameterliste ($...) fehlt. Dann kannst du beim Import einfach den Funktionsnamen (mit _ davor) angeben.</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907849</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 04 Nov 2005 08:40:05 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 08:52:46 GMT]]></title><description><![CDATA[<p>Das hat mit &quot;DLL Hell&quot; nichts zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907859</guid><dc:creator><![CDATA[hinweis]]></dc:creator><pubDate>Fri, 04 Nov 2005 08:52:46 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 09:12:59 GMT]]></title><description><![CDATA[<p>Gibt es zum Importieren nicht die Spezifikation &quot;__declspec(dllimport)&quot;? Die benötigst du afaik im Hauptprogramm, um die DLL-Funktion einbinden zu können.</p>
<p>Deshalb beginne DLL-Header oft so:</p>
<pre><code class="language-cpp">#ifdef MY_DLL_IMPL
  #define MY_DLL_DEC __declspec(dllexport)
#else
  #define MY_DLL_DEC __declspec(dllimport)
#endif

MY_DLL_DEC inf myFunc(void);

//...
</code></pre>
<p>(und die CPP-Datei zur Implementation definiert als erstes MY_DLL_IMPL, bevor sie den Header included)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907883</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 04 Nov 2005 09:12:59 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 09:17:11 GMT]]></title><description><![CDATA[<p>Das brauchst du aber nur, wenn du statisch bindest. Dynamisch ist das unnötig.<br />
Bei statischer Bindung hast du ja noch das Problem mit den libs welche du dann noch in das Microsoft-Format konvertieren mußt (COFF). Ich würd das hier lieber vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907889</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 04 Nov 2005 09:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 09:52:31 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1387">@Braunstein</a>:<br />
Danke, das mit extern &quot;C&quot; funktioniert, jetzt erkennt man eine schöne Schnittstellt im DLL-Viewer. Das Problem ist nur, dass ich eine Klasse exportieren möchte und vor class kann ich nicht export &quot;C&quot; hinschreiben (vermutlich weil Klassen nicht C sind).</p>
<p>Aus diesem Grund habe ich folgendes für meine Klasse versucht:</p>
<pre><code class="language-cpp">class __declspec(dllexport) __stdcall MyClass{};
</code></pre>
<p>Diese Art führt jedoch zu unmöglichen .dll Schnittstellen.</p>
<p>Q: Wie exportiert man eine Klasse korrekt?</p>
<p>Einbinden möchte ich die .dll im VS ohne .h oder .lib nach folgender Vorgabe:<br />
[url]<br />
<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_link_explicitly.asp" rel="nofollow">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_link_explicitly.asp</a><br />
[/url]</p>
<p>Zu diesem Zweck bin ich wie folgt vorgegangen:</p>
<pre><code class="language-cpp">HINSTANCE hDll = LoadLibrary(&quot;MyDll.dll&quot;);
FARPROC   pFunc = GetProcAddress(hDll, &quot;GetTestInt&quot;); // der Compiler hat gesagt ich muss FARPROC nehmen....
// jetzt habe ich einen Pointer, aber wohin...
</code></pre>
<p>Q: Was müsste ich mit pFunc anfangen damit ich den Wert 44 (wie in der .dll programmiert) bekomme? (int res = pFunc() geht nicht)</p>
<p>@hinweis: Danke für deinen großartigen Hinweis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907953</guid><dc:creator><![CDATA[Stoana]]></dc:creator><pubDate>Fri, 04 Nov 2005 09:52:31 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 09:59:38 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">// im nem header
typedef int (*PFUN_GET_TEST_INT) ();
PFUN_GET_TEST_INT  GetTestInt;

// in deiner cpp (bindet obigen header ein)
HINSTANCE hDll = LoadLibrary(&quot;MyDll.dll&quot;);

GetTestInt = (PFUN_GET_TEST_INT) ::GetProcAddress(dDll, &quot;_GetTestInt&quot;);

// verwendung
int a = GetTestInt();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/907962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907962</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Fri, 04 Nov 2005 09:59:38 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 10:04:34 GMT]]></title><description><![CDATA[<p>Ob sich Klassen so direkt von BCB nach MS exportieren lassen bezweifle ich mal. Bastel dir doch zwei Funktionen, von denen eine dir einen Pointer auf diese Klasse liefert und die andere diesen Pointer dann löscht. Du mußt dann natürlich die Klassendeklaration mit einbinden.<br />
Bezüglich der Funktion, weiß ich jetzt auch nicht was ein FARPROC ist.<br />
Ich würde es so machen.<br />
1. ein typedef auf deine Funktion erzeugen</p>
<pre><code class="language-cpp">typedef int myfunctType();
</code></pre>
<p>2. Zuweisen</p>
<pre><code class="language-cpp">myfunctType* myfunct = GetProcAddress(hDll, &quot;_GetTestInt&quot;);
</code></pre>
<p>3. Testen</p>
<pre><code class="language-cpp">if( myfunct == NULL )
{
  // Fehelerbehandlung
}
</code></pre>
<p>4. aufrufen</p>
<pre><code class="language-cpp">int res = myfunct();
</code></pre>
<p>[edit]ZU spät. <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="🙂"
    /> Man sollte zwischen drin halt nicht telefonieren.[edit]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907967</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 04 Nov 2005 10:04:34 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 12:21:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/588">@Sunday</a>, <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1387">@Braunstein</a>,</p>
<p>DANKE für eure Unterstützung, es geht!</p>
<p>Jetzt brauche ich nur noch einen Weg finden eine Klasse zugänglich zu machen (sonst muss ich mit einem neuen Konzept von vorne beginnen).</p>
<p>cu,<br />
Mario</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908072</guid><dc:creator><![CDATA[Stoana]]></dc:creator><pubDate>Fri, 04 Nov 2005 12:21:21 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 12:34:40 GMT]]></title><description><![CDATA[<p>Wie schon gesagt, kannst du das Einbinden der Klassen über Pointer machen. Irgandwie so</p>
<pre><code class="language-cpp">// In Headerdatei
class MyClass
{
// Deklarationen
};

//cpp von dll
extern &quot;C&quot; __declspec(dllexport) MyClass * get_myclass()
{
   MyClass *test= new MyClass;
   return test;
}
//---------------------------------------------------------------------------

extern &quot;C&quot; __declspec(dllexport) void free_myclass(MyClass * cc)
{
   delete cc;
}
//---------------------------------------------------------------------------
</code></pre>
<p>Die Funktionen geben dir dann einen Pointer auf deine gewünschte Klasse. Du mußt dann natürlich die Headerdatei mit den Deklarationen mit einbinden. Wenn du auch das verhindern willst, kannst du eine Art Wrapperklasse mit den public-Funktionen bereitstellen, die wiederum deine KLasse verwendet (siehe PIMPL). Dann brauchst du nur noch diese Headerdatei einzubinden.<br />
Die free-myclass Funktion ist notwendig, da der Pointer im Speicherbereich der dll erzeugt wird und ein delete im Aufrufenden Programm zu Fehlern führen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908085</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 04 Nov 2005 12:34:40 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 13:38:45 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1387">@Braunstein</a>:<br />
Dein Vorschlag scheint zu funktionieren, ich muss vermutlich nicht von vorne beginnen!</p>
<p>Die .dll mit deinen zwei Funktionen hat compiliert.<br />
Ich habe bei meinem VS-Projekt wo ich die .dll aufrufe jetzt das .h File eingebunden und folgendes programmiert:</p>
<pre><code class="language-cpp">#include &quot;MyDLL.h&quot;

typedef MyDllClass (*PGET_MYDLLCLASS);
PGET_MYDLLCLASS GetMyClass;
.
.
.
GetMyClass = (PGET_MYDLLCLASS)::GetProcAddress(hDll, &quot;get_myclass&quot;);
// Cool, jetzt habe ich einen Pointer auf meine dll klasse
</code></pre>
<p>Eine kleine Frage ist jedoch noch offen:<br />
Q: Wenn GetMyClass jetzt ein Pointer auf die Klasse in meiner dll ist warum funktioniert dann der -&gt; operator nicht? (ich habe GetMyClass-&gt;GetData(); oder auch MyDllClass * pDll = GetMyClass; probiert)</p>
<p>DANKE<br />
Mario</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908155</guid><dc:creator><![CDATA[Stoana]]></dc:creator><pubDate>Fri, 04 Nov 2005 13:38:45 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 13:43:24 GMT]]></title><description><![CDATA[<p>Du hast jetzt lediglich eine Funktion, die dir einen Pointer auf deine Klasse liefern kann.<br />
Du mußt dann also so etwas machen.</p>
<pre><code class="language-cpp">GetMyClass = (PGET_MYDLLCLASS)::GetProcAddress(hDll, &quot;_get_myclass&quot;);
FreeMyClass = (PFREE_MYDLLCLASS)::GetProcAddress(hDll, &quot;_free_myclass&quot;);
MyClass *my = GetMyClass();
// dann mit my arbeiten
...
// zum Schluß nicht vergessen
FreeMyClass(my);
</code></pre>
<p>Bitte vergess auch die Fehlerbehandlung (testen auf Nullpointer) nach GetProcAddress nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908163</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 04 Nov 2005 13:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 14:07:20 GMT]]></title><description><![CDATA[<p>Du hast natürlich wieder recht:<br />
MyClass *my = GetMyClass();<br />
funktioniert!</p>
<p>Wenn ich jetzt MyClass-&gt; schreibe kommt das Menü mit allen Methoden der Klasse.</p>
<p>....nur...<br />
egal welche Methode ich aufrufen will, ich bekomme immer einen:<br />
error LNK2001: unresovled external symbol......<br />
fatal error LNK1120: 1 unresolved externals</p>
<p>... dabei bin ich schon so nahe am Ziel <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/908183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908183</guid><dc:creator><![CDATA[Stoana]]></dc:creator><pubDate>Fri, 04 Nov 2005 14:07:20 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 14:10:24 GMT]]></title><description><![CDATA[<p>Ist die cpp, in der die Definition deiner Klasse steht mit in die dll gelinkt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908187</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 04 Nov 2005 14:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 14:15:21 GMT]]></title><description><![CDATA[<p>Noch was:<br />
Die Funktionen deiner Klasse sollten als Parameter nur POD-Typen (also char, int etc.) bzw. Pointer enthalten. Bei Übergaben von Klassen per Referenz kann es zu Problemen mit unterschiedlichen Bibliotheksimplementationen kommen.<br />
Ich hatte da mal ein Problem mit einer Referenz auf std::string zwischen BCB5 und 6.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908192</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 04 Nov 2005 14:15:21 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 14:25:47 GMT]]></title><description><![CDATA[<p>Ich bin der Meinung, dass mein .cpp File passt, es geht ja unter Borland, nur unter VS nicht.....</p>
<p>Mein .h File enthält eigentlich keine besonderen, außer selbst definierte, Typen:</p>
<pre><code class="language-cpp">#ifndef ENCODER_H
#define ENCODER_H

#define READ_TEMP   0
#define READ_ADC    3
#define SIUSIZE     4
#define OTPSIZE     4
#define SSISIZE     3
#define FESIZE      8

#define I2C_SIU     0x01
#define I2C_FE      0x02
#define I2C_ALSD    0x04
#define I2C_CORDIC  0x08
#define I2C_OFFSET  0x10
#define I2C_AGC     0x20
#define I2C_SYSTEM  0x40
//---------------------------------------------------------------------------

/** Error-codes used as return values for the usb-interfacing. */
typedef enum {
  ERROR_NO_ERR, /**&lt; No error occured. */
  ERROR_CMD_FAILED, /**&lt; The uC encoutered an error. */
  ERROR_CANNOT_CONNECT, /**&lt; The demoboard is probably not plugged in. */
  ERROR_NO_CONN, /**&lt; Transfer function was called on a closed connection */
  ERROR_TRANSMIT, /**&lt; An error occured during the transmission of a command. */
  ERROR_RECEIVE, /**&lt; An error occured during receiption. */
  ERROR_ILLEGAL_ARGUMENTS, /**&lt; The arguments are out of bounds. */
  ERROR_GENERIC /**&lt; An unspecified error occured. */
} UsbComError;

typedef enum {FRONTEND, ALSD, CORDIC, OFFSET, AUTOGC, SYSTEM, SIU } I2cReg;
typedef enum {AS5040, AS5043, AS5045} EncoderType;
typedef enum {RED, GREEN, YELLOW} EncoderState;
typedef struct I2cRegisters{
    unsigned char siu[SIUSIZE];
    unsigned char hsfe[FESIZE];
    unsigned char alsd[1];
    unsigned char cordic[3];
    unsigned char cordicState[1];
    unsigned char offset_comp[3];
    unsigned char autogc[1];
    unsigned char system[1];
} sI2cData;

typedef struct EncoderData{
    unsigned char otp[OTPSIZE];
    unsigned char ssi[SSISIZE];
    sI2cData i2c;
    unsigned int position;
    unsigned char magnitude;
    int sin;
    int cos;
    int ch0;
    int ch1;
} sEncoderData;

//class __declspec(dllexport) __stdcall Encoder{
class Encoder{
private:
    sEncoderData mData;
    bool IsAGCEnabled;
    bool IsMagCompEn;
    bool IsExternal;
    EncoderType type;
    EncoderState state;
    void SetEncoderType(EncoderType dev);
public:
    Encoder();
    EncoderType GetEncoderType();
    bool IsConnected();
    UsbComError Connect(const EncoderType dev);
    UsbComError Disconnect();
    sI2cData ReadI2C(unsigned char regList);
    void ReadOTP();
    double GetAngle();
    unsigned int GetPosition();
    void SetOTPByte(const unsigned char val, const unsigned char&amp; byteNum);
    char GetOTPByte(const unsigned char byteNum);
    unsigned int ReadSSI();
    unsigned char GetSSIByte(unsigned char num);
    char GetI2CByte(I2cReg reg, unsigned char byteNum);
    void SetI2CByte(I2cReg reg, unsigned char val, unsigned char byteNum = 0);
    int  GetSIN();
    int  GetCOS();
    int  GetCh0();
    int  GetCh1();
    unsigned char GetAGC();
    void SetAGC(unsigned char val);
    void DisableAGC();
    void EnableAGC();
    bool GetAGCState();
    unsigned char GetCordicState(); // just with AS5040
    bool IsExternalEncoder();
    void EnableExternalEncoder();
    void EnableOnboardEncoder();
    unsigned char GetMag();
    double GetADCChannel(unsigned char ch);
    UsbComError Zapp();
    EncoderState GetState();
};

#endif
</code></pre>
<p>Im .cpp habe ich dann: (das ist nur ein Auszug aus dem File)</p>
<pre><code class="language-cpp">#include &quot;Encoder.h&quot;
USEFILE(&quot;Encoder.h&quot;);
//---------------------------------------------------------------------------
UsbConnection mUsbCon;
bool WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved)
{
    return 1;
}
//---------------------------------------------------------------------------
extern &quot;C&quot; __declspec(dllexport) double GetDllVersion(void){
    return 1.0;
}

extern &quot;C&quot; __declspec(dllexport) Encoder * GetEncoder(){
    Encoder * pEnc = new Encoder;
    return pEnc;
}
extern &quot;C&quot; __declspec(dllexport) void FreeEncoder(Encoder * enc){
    delete enc;
}
///////////////////////////////////////////////////////////////////////////////
// Constructor
//
///////////////////////////////////////////////////////////////////////////////
Encoder::Encoder(){
    IsAGCEnabled = true;
    IsExternal = false;
    IsMagCompEn = false;
    type = AS5043;
}
.
.
. // usw....
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/908195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908195</guid><dc:creator><![CDATA[Stoana]]></dc:creator><pubDate>Fri, 04 Nov 2005 14:25:47 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 14:40:31 GMT]]></title><description><![CDATA[<p>Kann es sein, dass jetzt die Methoden innerhalb der Klasse dekoriert sind?</p>
<p>Der genaue Fehler lautet nämlich:<br />
error LNK2001 unresolved external symbol .... &quot;Encoder::GetCh0(void)&quot; ?GetCh0@Encoder@@$$FQSDF...</p>
<p>Das schaut aus wie das Problem, dass ich vor dem extern &quot;C&quot; gehabt habe. Nur jetzt innerhalb der Methode.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908208</guid><dc:creator><![CDATA[Stoana]]></dc:creator><pubDate>Fri, 04 Nov 2005 14:40:31 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 14:40:45 GMT]]></title><description><![CDATA[<p>Lass das USEFILE mal weg.<br />
Nur als Hinweis. Bei Deklarationen von enums, structs oder Klassen brauchst du kein typedef.<br />
statt</p>
<pre><code class="language-cpp">typedef enum {RED, GREEN, YELLOW} EncoderState;
</code></pre>
<p>das hier</p>
<pre><code class="language-cpp">enum EncoderState {RED, GREEN, YELLOW};
</code></pre>
<p>Genau so bei struct. Das ist aber kein Fehler.</p>
<p>Dei Problem besteht wohl darin, das der Kompiler nach inkludieren der Header auch die Definitionen deiner Klassenfunktionen sehen will. Da wirst du wohl nicht drumrumkommen die schon erwähnte Wrapperklasse zu schreiben oder statisch zu linken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908209</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 04 Nov 2005 14:40:45 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 14:58:46 GMT]]></title><description><![CDATA[<p>Hier mal ein Bsp. für so eine Wrapperklasse. Ist gekürzt.</p>
<pre><code class="language-cpp">class TChart2DForm;

typedef const char*    Tget_version();
// for TChartForm
typedef TChart2DForm * Tget_chart();
typedef void           Tfree_chart(TChart2DForm *&amp;);
typedef bool           Tshow_file(TChart2DForm * ch, const char* fname);

class TPostProcDll
{
  private:

    bool loadDll()
    {
        hdll = LoadLibrary(DllPath.c_str());
        if( hdll == 0 ) return false;
        Fget_chart = reinterpret_cast&lt;Tget_chart*&gt;(GetProcAddress(hdll, &quot;_get_chart&quot;));
        if( Fget_chart == NULL ) return false;
        Ffree_chart = reinterpret_cast&lt;Tfree_chart*&gt;(GetProcAddress(hdll, &quot;_free_chart&quot;));
        if( Ffree_chart == NULL ) return false;
        Fshow_file = reinterpret_cast&lt;Tshow_file*&gt;(GetProcAddress(hdll, &quot;_show_file&quot;));
        if( Fshow_file == NULL ) return false;
        Fget_version = reinterpret_cast&lt;Tget_version*&gt;(GetProcAddress(hdll, &quot;_get_version&quot;));
        if( Fget_version == NULL ) return false;
        return true;
    }

    bool loadFreeFunct()
    {
        hdll = LoadLibrary(DllPath.c_str());
        if( hdll == 0 ) return false;
        Ffree_chart = reinterpret_cast&lt;Tfree_chart*&gt;(GetProcAddress(hdll, &quot;_free_chart&quot;));
        if( Ffree_chart == NULL ) return false;
        return true;
    }

  public:
    TPostProcDll(const char* dllpath = &quot;&quot;) : Fget_version(0), Fget_chart(0), Ffree_chart(0), Fshow_file(0), DllPath(dllpath), m_chart(0), hdll(0)
    {
        if( DllPath.empty())
            DllPath = &quot;Postprocdll.dll&quot;;
    }

    ~TPostProcDll()
    {
        if( hdll != 0)
        {
            Ffree_chart(m_chart);
            FreeLibrary(hdll);
        }
    }

    bool showFile(const char* fname)
    {
        if( hdll == 0 &amp;&amp; !loadDll())
                return false;
        if( m_chart == NULL )
            m_chart = Fget_chart();
        if( !Fshow_file(m_chart, fname))
            return false;
        return true;
    };

    const char* getVersion()
    {
        if( hdll == 0 &amp;&amp; !loadDll())
                return &quot;&quot;;
        return Fget_version();
    }

  private:
        std::string DllPath;
  	TChart2DForm * m_chart;
        HINSTANCE hdll;
        Tget_version* Fget_version;
        Tget_chart*  Fget_chart;
        Tfree_chart* Ffree_chart;
        Tshow_file*  Fshow_file;
};
</code></pre>
<p>die cpp</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	return 1;
}
//---------------------------------------------------------------------------

const char* Version = &quot;1.0.1&quot;;

namespace DELPHIN_POSTPROC {

extern &quot;C&quot; __declspec(dllexport) TChart2DForm * get_chart()
{
        TChart2DForm *chart = new TChart2DForm(NULL);
	return chart;
}
//---------------------------------------------------------------------------

extern &quot;C&quot; __declspec(dllexport) const char* get_version()
{
	return Version;
}
//---------------------------------------------------------------------------

extern &quot;C&quot; __declspec(dllexport) void free_chart(TChart2DForm *&amp; ch)
{
	delete ch;
        ch = NULL;
}
//---------------------------------------------------------------------------

extern &quot;C&quot; __declspec(dllexport) bool show_file(TChart2DForm * ch, const char* fname)
{
    TStringList *list = new TStringList;
    list-&gt;Add(fname);
    DimOutp::TDIMReadError res = ch-&gt;ShowChart(list, true, false, PostProcCallBacks());
    delete list;
    if( res != DimOutp::NoError)
    {
        return false;
    }
    return true;
}
//---------------------------------------------------------------------------
</code></pre>
<p>Das ist ein Beispiel von mir, also stör dich nicht an den Namen. Hier muß man dann nur die oben genannte Headerdatei einbinden, die Wrapperklasse im Hauptprogramm instanziieren und schon gehts (zumindest bei mir <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/908226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908226</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 04 Nov 2005 14:58:46 GMT</pubDate></item><item><title><![CDATA[Reply to Ich bin in der DLL Hell :-( on Fri, 04 Nov 2005 14:56:06 GMT]]></title><description><![CDATA[<p>Danke für deinen Input mit den enums. Ich kenne sonst keine Programmierer daher sind solche Hinweise für mich sehr wertvoll.</p>
<p>Da die Schnittstelle meiner .dll jetzt nur aus 3 Funktionen besteht werde ich versuchen sie statisch zu linken.</p>
<p>Mal schauen ob das geht. An meiner .dll muss ich da ja nichts ändern.</p>
<p>Ich werde dich auf dem Laufenden halten.</p>
<p>Danke,<br />
Mario</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908230</guid><dc:creator><![CDATA[Stoana]]></dc:creator><pubDate>Fri, 04 Nov 2005 14:56:06 GMT</pubDate></item></channel></rss>