<?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[DLL für Labview]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>hab schon mal was wegen labview gepostet, aber mittlerweile ein anderes problem.</p>
<p>ich habe eine DLL geschrieben kurz gesagt folgendes macht (bzw. machen sollte).</p>
<p>1. eine dll laden<br />
2. eine funktion aus dieser mit einer callbackfunktion aufrufen<br />
3. immer wenn die callbackfunktion genutzt wird (wenn ein drahtlosmodul das sendet sollte es so sein) sollen die daten als event an labview geschickt werden.</p>
<p>so schauts aus:</p>
<pre><code class="language-cpp">// ant_sendevent.cpp : Definiert die exportierten Funktionen für die DLL-Anwendung.
//

#include &quot;stdafx.h&quot;
#include &quot;stdio.h&quot;
#include &quot;ant_sendevent.h&quot;
#include &quot;extcode.h&quot; //labview inlcude
#include &lt;cstdlib&gt;

#define STRING_LENGHT 256	

//definitonen für ANT_Load und UnLoad
static HMODULE hANTdll;
static BOOL bLoaded = FALSE;
UCHAR aucResponseBuffer[MESG_DATA_SIZE];
UCHAR aucChannelEventBuffer[MESG_DATA_SIZE];
char myresponsebuffer[64];
char myeventbuffer[64];
LStrHandle responseStringHandle;
LStrHandle eventStringHandle;
UCHAR ucChannel_;
LVUserEventRef antResponse;
LVUserEventRef antEvent;

//Functionen der ANT DLL
P_ANT_ARF         ANT_AssignResponseFunction;
P_ANT_AEF         ANT_AssignChannelEventFunction;

// DLL Laden.
///////////////////////////////////////////////////////////////////////
ANT_SENDEVENT_API BOOL ANT_Load(void)
{
   if (bLoaded)
      return TRUE;

   hANTdll = LoadLibraryA(&quot;ANT_DLL.dll&quot;);
   if (hANTdll == NULL)
      return FALSE;

   ANT_AssignResponseFunction = (P_ANT_ARF) GetProcAddress(hANTdll, &quot;ANT_AssignResponseFunction&quot;);
   ANT_AssignChannelEventFunction = (P_ANT_AEF) GetProcAddress(hANTdll, &quot;ANT_AssignChannelEventFunction&quot;);

   if (ANT_AssignResponseFunction == NULL)
      return FALSE;
   if (ANT_AssignChannelEventFunction == NULL)
      return FALSE;

   bLoaded = TRUE;
   return TRUE;
}

// DLL freigeben
///////////////////////////////////////////////////////////////////////
ANT_SENDEVENT_API BOOL ANT_UnLoad(void)
{
   if (hANTdll != NULL)
   {
      FreeLibrary(hANTdll);

   }
   bLoaded = FALSE;
   return FALSE;
}

// Diese Funktion soll er bei einem ChannelEvent nutzen: Den Bufferinhalt 
// in myeventbuffer kopieren und mittels der Funktion SendEvent, den Event
// an Labview weitergeben - unabhänging von der Event (ucEvent) Art - wird dann
// in Labview gemanaged.
///////////////////////////////////////////////////////////////////////
BOOL ANT_ChannelEventFunction(UCHAR ucChannel, UCHAR ucEvent)
{

	strcpy((char*)myeventbuffer,(char*)aucChannelEventBuffer);
	SendEvent(&amp;antEvent);
	return TRUE;

}

// Diese Funktion soll zum Antworten nutzen: Den Bufferinhalt 
// in myresponsebuffer kopieren und mittels der Funktion SendResponse, den Event
// an Labview weitergeben.
BOOL ANT_ResponseFunction(UCHAR ucChannel, UCHAR ucResponseMesgID)
{
	//Speichergröße für myeventbuffer an aucChannelEventBuffer anpassen
	//myresponsebuffer=(char*)malloc(strlen((char*)aucResponseBuffer)+1);
	strcpy((char*)myresponsebuffer,(char*)aucResponseBuffer);
	SendResponse(&amp;antResponse);
	return TRUE;
}
// Die Funktion ruft die Funktionen aus der ANT Dll auf und führt sie mit meinen Buffern 
// und den Callbackfunktionen aus
ANT_SENDEVENT_API BOOL functioncaller(UCHAR ucChannel_)
{
    if(ANT_AssignResponseFunction != NULL  &amp;&amp; ANT_AssignChannelEventFunction != NULL)
	{
		ANT_AssignResponseFunction(&amp;ANT_ResponseFunction, aucResponseBuffer);
		ANT_AssignChannelEventFunction(1, &amp;ANT_ChannelEventFunction, aucChannelEventBuffer);
		return TRUE;

	}
		return FALSE;
}
// Benachrichtigt LabView über den Event und gibt den Inhalt von myeventbuffer weiter (wird in Labview gepoolt)
ANT_SENDEVENT_API void SendEvent(LVUserEventRef *antEvent)
{

	//Allocate memory for a LabVIEW string handle using LabVIEW's
	//memory manager functions.
	eventStringHandle=(LStrHandle)DSNewHandle(sizeof(int32)+STRING_LENGHT*sizeof(uChar));

	PopulateStringHandle(eventStringHandle,(char*)&amp;myeventbuffer);

	PostLVUserEvent(*antEvent,(char *)&amp;eventStringHandle);
	return;
}

// Benachrichtigt LabView über den Response und gibt den Inhalt von myresponsebuffer weiter (wird in Labview gepoolt)
ANT_SENDEVENT_API void SendResponse(LVUserEventRef *antResponse)
{
		//Allocate memory for a LabVIEW string handle using LabVIEW's
	//memory manager functions.
	responseStringHandle=(LStrHandle)DSNewHandle(sizeof(int32)+STRING_LENGHT*sizeof(uChar));

	PopulateStringHandle(responseStringHandle,(char*)&amp;myresponsebuffer);

	PostLVUserEvent(*antResponse,(char*)&amp;responseStringHandle);
	return;
}
void PopulateStringHandle(LStrHandle lvStringHandle,char* stringData)
{
	//Empties the buffer
	memset(LStrBuf(*lvStringHandle),'\0',STRING_LENGHT);

	//Fills the string buffer with stringData
	sprintf((char*)LStrBuf(*lvStringHandle),&quot;%s&quot;,stringData);

	//Informs the LabVIEW string handle about the size of the size
	LStrLen(*lvStringHandle)=strlen(stringData);

	return;
}
</code></pre>
<p>mein problem ist nun fogendes: das erste mal, wenn ich mein labview vi mit der dll aufrufe passiert nix, beim zweiten mal wird einmal ein event ausgelöst und die richtigen daten nur einmal geschickt.</p>
<p>ich gehe mal davon aus, dass die callbackfunktion nur einmal - bei functioncaller aufruf genutzt wird... aber wieso sonst nicht? ich habe mir gedacht, dass die einmal aufgerufene funktion sowieso im speicher bleibt - oder muss ich dass irgendwie in eine schleife packen?</p>
<p>danke für die hilfe<br />
martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222990/dll-für-labview</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 14:35:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222990.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 Sep 2008 11:45:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to DLL für Labview on Sat, 20 Sep 2008 12:00:08 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>hab schon mal was wegen labview gepostet, aber mittlerweile ein anderes problem.</p>
<p>ich habe eine DLL geschrieben kurz gesagt folgendes macht (bzw. machen sollte).</p>
<p>1. eine dll laden<br />
2. eine funktion aus dieser mit einer callbackfunktion aufrufen<br />
3. immer wenn die callbackfunktion genutzt wird (wenn ein drahtlosmodul das sendet sollte es so sein) sollen die daten als event an labview geschickt werden.</p>
<p>so schauts aus:</p>
<pre><code class="language-cpp">// ant_sendevent.cpp : Definiert die exportierten Funktionen für die DLL-Anwendung.
//

#include &quot;stdafx.h&quot;
#include &quot;stdio.h&quot;
#include &quot;ant_sendevent.h&quot;
#include &quot;extcode.h&quot; //labview inlcude
#include &lt;cstdlib&gt;

#define STRING_LENGHT 256	

//definitonen für ANT_Load und UnLoad
static HMODULE hANTdll;
static BOOL bLoaded = FALSE;
UCHAR aucResponseBuffer[MESG_DATA_SIZE];
UCHAR aucChannelEventBuffer[MESG_DATA_SIZE];
char myresponsebuffer[64];
char myeventbuffer[64];
LStrHandle responseStringHandle;
LStrHandle eventStringHandle;
UCHAR ucChannel_;
LVUserEventRef antResponse;
LVUserEventRef antEvent;

//Functionen der ANT DLL
P_ANT_ARF         ANT_AssignResponseFunction;
P_ANT_AEF         ANT_AssignChannelEventFunction;

// DLL Laden.
///////////////////////////////////////////////////////////////////////
ANT_SENDEVENT_API BOOL ANT_Load(void)
{
   if (bLoaded)
      return TRUE;

   hANTdll = LoadLibraryA(&quot;ANT_DLL.dll&quot;);
   if (hANTdll == NULL)
      return FALSE;

   ANT_AssignResponseFunction = (P_ANT_ARF) GetProcAddress(hANTdll, &quot;ANT_AssignResponseFunction&quot;);
   ANT_AssignChannelEventFunction = (P_ANT_AEF) GetProcAddress(hANTdll, &quot;ANT_AssignChannelEventFunction&quot;);

   if (ANT_AssignResponseFunction == NULL)
      return FALSE;
   if (ANT_AssignChannelEventFunction == NULL)
      return FALSE;

   bLoaded = TRUE;
   return TRUE;
}

// DLL freigeben
///////////////////////////////////////////////////////////////////////
ANT_SENDEVENT_API BOOL ANT_UnLoad(void)
{
   if (hANTdll != NULL)
   {
      FreeLibrary(hANTdll);

   }
   bLoaded = FALSE;
   return FALSE;
}

// Diese Funktion soll er bei einem ChannelEvent nutzen: Den Bufferinhalt 
// in myeventbuffer kopieren und mittels der Funktion SendEvent, den Event
// an Labview weitergeben - unabhänging von der Event (ucEvent) Art - wird dann
// in Labview gemanaged.
///////////////////////////////////////////////////////////////////////
BOOL ANT_ChannelEventFunction(UCHAR ucChannel, UCHAR ucEvent)
{

	strcpy((char*)myeventbuffer,(char*)aucChannelEventBuffer);
	SendEvent(&amp;antEvent);
	return TRUE;

}

// Diese Funktion soll zum Antworten nutzen: Den Bufferinhalt 
// in myresponsebuffer kopieren und mittels der Funktion SendResponse, den Event
// an Labview weitergeben.
BOOL ANT_ResponseFunction(UCHAR ucChannel, UCHAR ucResponseMesgID)
{
	//Speichergröße für myeventbuffer an aucChannelEventBuffer anpassen
	//myresponsebuffer=(char*)malloc(strlen((char*)aucResponseBuffer)+1);
	strcpy((char*)myresponsebuffer,(char*)aucResponseBuffer);
	SendResponse(&amp;antResponse);
	return TRUE;
}
// Die Funktion ruft die Funktionen aus der ANT Dll auf und führt sie mit meinen Buffern 
// und den Callbackfunktionen aus
ANT_SENDEVENT_API BOOL functioncaller(UCHAR ucChannel_)
{
    if(ANT_AssignResponseFunction != NULL  &amp;&amp; ANT_AssignChannelEventFunction != NULL)
	{
		ANT_AssignResponseFunction(&amp;ANT_ResponseFunction, aucResponseBuffer);
		ANT_AssignChannelEventFunction(1, &amp;ANT_ChannelEventFunction, aucChannelEventBuffer);
		return TRUE;

	}
		return FALSE;
}
// Benachrichtigt LabView über den Event und gibt den Inhalt von myeventbuffer weiter (wird in Labview gepoolt)
ANT_SENDEVENT_API void SendEvent(LVUserEventRef *antEvent)
{

	//Allocate memory for a LabVIEW string handle using LabVIEW's
	//memory manager functions.
	eventStringHandle=(LStrHandle)DSNewHandle(sizeof(int32)+STRING_LENGHT*sizeof(uChar));

	PopulateStringHandle(eventStringHandle,(char*)&amp;myeventbuffer);

	PostLVUserEvent(*antEvent,(char *)&amp;eventStringHandle);
	return;
}

// Benachrichtigt LabView über den Response und gibt den Inhalt von myresponsebuffer weiter (wird in Labview gepoolt)
ANT_SENDEVENT_API void SendResponse(LVUserEventRef *antResponse)
{
		//Allocate memory for a LabVIEW string handle using LabVIEW's
	//memory manager functions.
	responseStringHandle=(LStrHandle)DSNewHandle(sizeof(int32)+STRING_LENGHT*sizeof(uChar));

	PopulateStringHandle(responseStringHandle,(char*)&amp;myresponsebuffer);

	PostLVUserEvent(*antResponse,(char*)&amp;responseStringHandle);
	return;
}
void PopulateStringHandle(LStrHandle lvStringHandle,char* stringData)
{
	//Empties the buffer
	memset(LStrBuf(*lvStringHandle),'\0',STRING_LENGHT);

	//Fills the string buffer with stringData
	sprintf((char*)LStrBuf(*lvStringHandle),&quot;%s&quot;,stringData);

	//Informs the LabVIEW string handle about the size of the size
	LStrLen(*lvStringHandle)=strlen(stringData);

	return;
}
</code></pre>
<p>mein problem ist nun fogendes: das erste mal, wenn ich mein labview vi mit der dll aufrufe passiert nix, beim zweiten mal wird einmal ein event ausgelöst und die richtigen daten nur einmal geschickt.</p>
<p>ich gehe mal davon aus, dass die callbackfunktion nur einmal - bei functioncaller aufruf genutzt wird... aber wieso sonst nicht? ich habe mir gedacht, dass die einmal aufgerufene funktion sowieso im speicher bleibt - oder muss ich dass irgendwie in eine schleife packen?</p>
<p>danke für die hilfe<br />
martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1585211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1585211</guid><dc:creator><![CDATA[sojahulk]]></dc:creator><pubDate>Sat, 20 Sep 2008 12:00:08 GMT</pubDate></item><item><title><![CDATA[Reply to DLL für Labview on Sat, 20 Sep 2008 13:48:16 GMT]]></title><description><![CDATA[<p>was soll Labview sein und woher soll ich sowas wissen, das ist doch ein software spezifisches problem. da frag mal die labview leute</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1585267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1585267</guid><dc:creator><![CDATA[ascda]]></dc:creator><pubDate>Sat, 20 Sep 2008 13:48:16 GMT</pubDate></item><item><title><![CDATA[Reply to DLL für Labview on Sat, 20 Sep 2008 14:04:25 GMT]]></title><description><![CDATA[<p>ich zwinge ja keinen zum antworten, und außerdem geht es mir eigentlich darum, ob ich mit dem callbackfunctionpoiner was falsch gemacht habe, da mir der callback nicht geht - das hat mit labview nix zu tun, aber vielleicht gibts ja wen, der labview erfahrung hat und mir helfen kann, denn die labviewforen sind halt nicht so gut vie <a href="http://c-plusplus.net" rel="nofollow">c-plusplus.net</a> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1585278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1585278</guid><dc:creator><![CDATA[sojahulk_]]></dc:creator><pubDate>Sat, 20 Sep 2008 14:04:25 GMT</pubDate></item><item><title><![CDATA[Reply to DLL für Labview on Sat, 20 Sep 2008 14:55:17 GMT]]></title><description><![CDATA[<p>Teste doch Schrittweise wo sich der Fehler befindet.<br />
Z.B. könntest Du anstelle dass die Unterliegende DLL die Callbacks ausführt, sie von einem Timer ausführen lassen.</p>
<p>So könntest Du feststellen obs am LabView &lt;&gt; Deine Wrapper DLL Teil liegt, oder am Deine Wrapper DLL &lt;&gt; Unterliegende DLL Teil liegt.</p>
<p>Edit:<br />
Bzw. könntest Du auch jedesmal etwas auf den Debug Output (schreiben mit OutputDebgString(..) und dem DebugView von Sysinternals anschaubar) wenn der Callback ausgeführt wird (in deiner Wrapper DLL). So stellst Du fest, ob wirklich alle Callbacks in deiner Wrapper DLL ankommen.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1585297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1585297</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sat, 20 Sep 2008 14:55:17 GMT</pubDate></item></channel></rss>