LabVIEWForum.de - VC++ 6.0 DLL ins Labview--Ist es möglich output type as char*?

LabVIEWForum.de

Normale Version: VC++ 6.0 DLL ins Labview--Ist es möglich output type as char*?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,
ich habe eine Kombination zwischen Labview und VC++ getestet , da jeder Vorteile hat. Nach dieser Einweisung ( http://www.ni.com/white-paper/3056/en/rating/4 ), habe ich ein DLL Testprogramm geschrieben wie folgendes:

// A_LXC_COM.cpp : Definiert den Einsprungpunkt für die DLL-Anwendung.
//

#include "stdafx.h"
#include <string.h>

//Function declarations
extern "C" __declspec(dllexport) int __cdecl compare2strings(char *s1, char *s2, char *result);

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

__declspec(dllexport) int __cdecl compare2strings(char *s1, char *s2, char *result)
{
if (strcoll(s1,s2)==0) result = “+”;
return 0;
}

Von Labview habe ich keine Fehlermeldung bekommen, aber auch kein Ergebnis. Dann habe ich 'Output Type' nach 'int' geändert, funktioniert perfekt.
Nimmt Labview keine Output von string, oder?
(05.06.2013 12:44 )Danyang schrieb: [ -> ]Hallo zusammen,
ich habe eine Kombination zwischen Labview und VC++ getestet , da jeder Vorteile hat. Nach dieser Einweisung ( http://www.ni.com/white-paper/3056/en/rating/4 ), habe ich ein DLL Testprogramm geschrieben wie folgendes:

// A_LXC_COM.cpp : Definiert den Einsprungpunkt für die DLL-Anwendung.
//

#include "stdafx.h"
#include <string.h>

//Function declarations
extern "C" __declspec(dllexport) int __cdecl compare2strings(char *s1, char *s2, char *result);

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

__declspec(dllexport) int __cdecl compare2strings(char *s1, char *s2, char *result)
{
if (strcoll(s1,s2)==0) result = “+”;
return 0;
}

Von Labview habe ich keine Fehlermeldung bekommen, aber auch kein Ergebnis. Dann habe ich 'Output Type' nach 'int' geändert, funktioniert perfekt.
Nimmt Labview keine Output von string, oder?

Doch, aber Du machst einen grossen Fehler!

Du weist in der Funktion dem char Pointer den Du von LabVIEW aus übergibst einen anderen String Pointer zu. Nur kann dieser Pointer nicht an LabVIEW zurückgegeben werden, da der Pointer selbst By Value übergeben wird.

Aber auch Änderung in:

Code:
__declspec(dllexport) int __cdecl compare2strings(char *s1, char *s2, char **result)
{
    if (strcoll(s1,s2)==0) *result = “+”;
    return 0;
}

ist zwar korrekt aber macht zumindest in Zusammenhang mit LabVIEW wenig Sinn da Du dann mit Memorypointerakrobatik auf LabVIEW Diagrammebene zu tun bekommst.

Besser ist:

Code:
__declspec(dllexport) int __cdecl compare2strings(char *s1, char *s2, char *result)
{
    if (strcoll(s1,s2)==0)  strcpy(result, “+”);
    return 0;
}

und noch besser wäre:

Code:
__declspec(dllexport) int __cdecl compare2strings(char *s1, char *s2, char *result, int len)
{
    if (strcoll(s1,s2)==0)  strncpy(result, “+”, len);
    return 0;
}

In beiden Fällen musst Du auf LabVIEW Diagrammebene sicherstellen, das der String für "result" mit minimal 2 Charactern Länge angelegt wird, bevor Du ihn an die Call Library node übergibst.
Referenz-URLs