<?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[Wo ist die Referenz hin ??]]></title><description><![CDATA[<p>Hallo Leute..</p>
<p>habe eine Klassengesteuerte C++ DLL zur Verfügung die ich gern in Delphi nutzen wollte. Die Lösung dafür war eine C- Wrapper- DLL in welcher ich eine Instanz der Klasse erzeuge und darauffolgend mittels exportierter Funktionen auf Funktionen dieser Klasse zugreife.</p>
<p>Hier der C++- Code:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &quot;CTIMultiClt.h&quot;
#include &quot;MultiCltMap.h&quot;

HWND targetWindow;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{

    return TRUE;
}

extern &quot;C&quot; __declspec(dllexport) bool ConnectToCAEServer(char* IP);
extern &quot;C&quot; __declspec(dllexport) bool setApplClassName(char* ApplClassName);
extern &quot;C&quot; __declspec(dllexport) int OpenLine();
extern &quot;C&quot; __declspec(dllexport) bool Disconnect();

class CSampleMultiClient : public CtMultiDevClient
{
public:
	CSampleMultiClient(void) {}
	virtual ~CSampleMultiClient(void) {}

protected:
	// Überschreiben der Callback-Funktionen
	long OnEvent(const CtMultiDevMsg* a_pMultiDevMsg);
	long OnInfoEvent(const CtMultiDevMsg* a_pMultiDevMsg);
	long OnReply(const CtMultiDevReply* a_pMultiDevReply);

};

long CSampleMultiClient::OnEvent(const CtMultiDevMsg* a_pMultiDevMsg)
{

	[...] // Ist hier nicht erwähnenswert !
}

long CSampleMultiClient::OnInfoEvent(const CtMultiDevMsg* a_pMultiDevMsg)
{
	[...] // Ist hier nicht erwähnenswert !
}

long CSampleMultiClient::OnReply(const CtMultiDevReply* a_pMultiDevReply)
{
	[...] // Ist hier nicht erwähnenswert !
}

//=====================================================================================================================================

// wrapper functions

CSampleMultiClient cti;          // globale Referenz zur neu erzeugten Instanz

// connect to CAEServer
bool ConnectToCAEServer(char* IP) {

	if (S_OK != cti.OpenConnection(IP)) {
			return false;
	} else return true; 

}

// Open Line
int OpenLine() {
HRESULT LO;
long ReplyID;

	LO = cti.LineOpen(&quot;1169&quot;, ReplyID);

	if (S_OK == LO) {
		// Line geöffnet
		return 1;
	}

	if (E_NOINTERFACE == LO) {
		// Es besteht keine CTI Server Verbindung
		return 2;
	}
}
</code></pre>
<p>In Delphi rufe ich zuerst die &quot;ConnectToCAEServer&quot; - Funktion auf und übergebe dabei die IP- Adresse des Servers. Darauffolgend bekomme ich ein &quot;true&quot; zurück, somit besteht eine Verbindung. Danach öffne ich über die &quot;OpenLine()&quot;- Funktion die Line mit der Telefonnummer &quot;1169&quot;... dabei bekomme ich in Delphi folgende Meldung:</p>
<p>&quot;Zugriffsverletzung bei 0x00b6fedc: Lesen von Adresse 0x00000005&quot;</p>
<p>Wenn ich die &quot;ConnectToCAEServer&quot; - Funktion nicht aufrufe sondern sofort die &quot;OpenLine()&quot;- Funktion, dann bekomm ich ordnungsgemäß den Rückgabewert 2 -&gt; &quot;Es besteht keine CTI Server Verbindung&quot;.</p>
<p>Wenn ich die &quot;OpenLine()&quot;- Funktion folgendermaßen abändere:</p>
<pre><code class="language-cpp">// Open Line
int OpenLine() {
HRESULT LO;
long ReplyID;

CSampleMultiClient cti;   // =============== lokal referenziert =====================================  

cti.OpenConnection(IP)    // =============== mit lokaler Instanz zum Server verbunden =============== 

	LO = cti.LineOpen(&quot;1169&quot;, ReplyID);

	if (S_OK == LO) {
		// Line geöffnet
		return 1;
	}

	if (E_NOINTERFACE == LO) {
		// Es besteht keine CTI Server Verbindung
		return 2;
	}
}
</code></pre>
<p>...... bekomme ich den Rückgabewert 1 -&gt; Line auf Server geöffnet .....</p>
<p>warum funktioniert die Geschichte nicht wenn ich die Klasse einmal global referenziere und dann über die exportierten Funktionen einzeln auf diese Instanz zugreife? Geht die Referenz verloren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/198908/wo-ist-die-referenz-hin</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 18:26:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198908.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Nov 2007 21:50:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wo ist die Referenz hin ?? on Mon, 26 Nov 2007 21:50:31 GMT]]></title><description><![CDATA[<p>Hallo Leute..</p>
<p>habe eine Klassengesteuerte C++ DLL zur Verfügung die ich gern in Delphi nutzen wollte. Die Lösung dafür war eine C- Wrapper- DLL in welcher ich eine Instanz der Klasse erzeuge und darauffolgend mittels exportierter Funktionen auf Funktionen dieser Klasse zugreife.</p>
<p>Hier der C++- Code:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &quot;CTIMultiClt.h&quot;
#include &quot;MultiCltMap.h&quot;

HWND targetWindow;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{

    return TRUE;
}

extern &quot;C&quot; __declspec(dllexport) bool ConnectToCAEServer(char* IP);
extern &quot;C&quot; __declspec(dllexport) bool setApplClassName(char* ApplClassName);
extern &quot;C&quot; __declspec(dllexport) int OpenLine();
extern &quot;C&quot; __declspec(dllexport) bool Disconnect();

class CSampleMultiClient : public CtMultiDevClient
{
public:
	CSampleMultiClient(void) {}
	virtual ~CSampleMultiClient(void) {}

protected:
	// Überschreiben der Callback-Funktionen
	long OnEvent(const CtMultiDevMsg* a_pMultiDevMsg);
	long OnInfoEvent(const CtMultiDevMsg* a_pMultiDevMsg);
	long OnReply(const CtMultiDevReply* a_pMultiDevReply);

};

long CSampleMultiClient::OnEvent(const CtMultiDevMsg* a_pMultiDevMsg)
{

	[...] // Ist hier nicht erwähnenswert !
}

long CSampleMultiClient::OnInfoEvent(const CtMultiDevMsg* a_pMultiDevMsg)
{
	[...] // Ist hier nicht erwähnenswert !
}

long CSampleMultiClient::OnReply(const CtMultiDevReply* a_pMultiDevReply)
{
	[...] // Ist hier nicht erwähnenswert !
}

//=====================================================================================================================================

// wrapper functions

CSampleMultiClient cti;          // globale Referenz zur neu erzeugten Instanz

// connect to CAEServer
bool ConnectToCAEServer(char* IP) {

	if (S_OK != cti.OpenConnection(IP)) {
			return false;
	} else return true; 

}

// Open Line
int OpenLine() {
HRESULT LO;
long ReplyID;

	LO = cti.LineOpen(&quot;1169&quot;, ReplyID);

	if (S_OK == LO) {
		// Line geöffnet
		return 1;
	}

	if (E_NOINTERFACE == LO) {
		// Es besteht keine CTI Server Verbindung
		return 2;
	}
}
</code></pre>
<p>In Delphi rufe ich zuerst die &quot;ConnectToCAEServer&quot; - Funktion auf und übergebe dabei die IP- Adresse des Servers. Darauffolgend bekomme ich ein &quot;true&quot; zurück, somit besteht eine Verbindung. Danach öffne ich über die &quot;OpenLine()&quot;- Funktion die Line mit der Telefonnummer &quot;1169&quot;... dabei bekomme ich in Delphi folgende Meldung:</p>
<p>&quot;Zugriffsverletzung bei 0x00b6fedc: Lesen von Adresse 0x00000005&quot;</p>
<p>Wenn ich die &quot;ConnectToCAEServer&quot; - Funktion nicht aufrufe sondern sofort die &quot;OpenLine()&quot;- Funktion, dann bekomm ich ordnungsgemäß den Rückgabewert 2 -&gt; &quot;Es besteht keine CTI Server Verbindung&quot;.</p>
<p>Wenn ich die &quot;OpenLine()&quot;- Funktion folgendermaßen abändere:</p>
<pre><code class="language-cpp">// Open Line
int OpenLine() {
HRESULT LO;
long ReplyID;

CSampleMultiClient cti;   // =============== lokal referenziert =====================================  

cti.OpenConnection(IP)    // =============== mit lokaler Instanz zum Server verbunden =============== 

	LO = cti.LineOpen(&quot;1169&quot;, ReplyID);

	if (S_OK == LO) {
		// Line geöffnet
		return 1;
	}

	if (E_NOINTERFACE == LO) {
		// Es besteht keine CTI Server Verbindung
		return 2;
	}
}
</code></pre>
<p>...... bekomme ich den Rückgabewert 1 -&gt; Line auf Server geöffnet .....</p>
<p>warum funktioniert die Geschichte nicht wenn ich die Klasse einmal global referenziere und dann über die exportierten Funktionen einzeln auf diese Instanz zugreife? Geht die Referenz verloren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1410645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1410645</guid><dc:creator><![CDATA[peeage]]></dc:creator><pubDate>Mon, 26 Nov 2007 21:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wo ist die Referenz hin ?? on Tue, 27 Nov 2007 08:56:13 GMT]]></title><description><![CDATA[<p>Keiner ne Idee ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1410780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1410780</guid><dc:creator><![CDATA[peeage]]></dc:creator><pubDate>Tue, 27 Nov 2007 08:56:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wo ist die Referenz hin ?? on Tue, 27 Nov 2007 09:17:03 GMT]]></title><description><![CDATA[<p>Ist zwar das C++-Forum - aber wie machst du das auf Delphi-Seite? Hast du die DLL über external-Deklarationen eingebunden? Oder über LoadModule/GetProcAddress-Aufrufe? Falls letzteres, du entlädst die DLL zwischen den Aufrufen doch nicht wieder, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1410790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1410790</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 27 Nov 2007 09:17:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wo ist die Referenz hin ?? on Tue, 27 Nov 2007 09:48:25 GMT]]></title><description><![CDATA[<p>hallo 7H3 N4C3R .. in Delphi habe ich schon beide Varianten versucht. Beim dynamischen Laden der DLL wird das Handle dieser DLL erst beim Beenden des Programmes wieder frei gegeben ! Daran kanns also net liegen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1410821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1410821</guid><dc:creator><![CDATA[peeage]]></dc:creator><pubDate>Tue, 27 Nov 2007 09:48:25 GMT</pubDate></item><item><title><![CDATA[Reply to Wo ist die Referenz hin ?? on Tue, 27 Nov 2007 10:47:10 GMT]]></title><description><![CDATA[<p>Ich bin mir auch nicht sicher, ob du das so machen kannst mit dem globalen Objekt. IIRC ist das &quot;eigentliche&quot; Programm schon direkt nachdem der DLLEntryPoint gerufen wurde, wieder zu Ende, d.h. dein globales Objekt wird wieder abgeräumt. Mach doch mal ein Singleton draus (eins was sich 'nen Ponter merkt, kein Myers-Singleton) oder Debugausgaben rein in Konstruktor und Destruktor (meinetwegen in ein File oder so).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1410836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1410836</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 27 Nov 2007 10:47:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wo ist die Referenz hin ?? on Tue, 27 Nov 2007 20:41:49 GMT]]></title><description><![CDATA[<p>danke für deine antwort .. habe das problem aber mittlerweile schon gelöst !</p>
<p>in den überschriebenen callback- funktionen ( deren inhalt ich mit &quot;[...]&quot; gekennzeichnet habe ) waren noch printf's zur konsolenausgabe vorhanden .. diese haben diesen fehler erzeugt :).</p>
<p>ansonsten funktioniert alles soweit. das globale objekt/instanz bleibt so lange erhalten bis ich das handle der dll wieder freigebe.</p>
<p>gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1411255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411255</guid><dc:creator><![CDATA[peeage]]></dc:creator><pubDate>Tue, 27 Nov 2007 20:41:49 GMT</pubDate></item></channel></rss>