DLL of LabVIEW with arrays of strings in c ++

I'm looking to use labview to retrieve a list of gas to a txt file and then transfer this list to gas in a C++ program.

I thought it would be easier to just list the gas transfer a string array of the DLLs in labview to my C++ program.  However, I am not able to output the list of gas using tables; I am only able to output the pointer, not the chain that makes reference to the needle.  Of course, I have a syntactic problem with my method of output.

I have no problem out of the list of gas via a simple string.  However, the approach of single string requires multiple calls to the relevant dll.

My code is based on the labview dll for C++ routines example titled call of Labview DLL in Visual C++ this Passes table manages in reference (http://zone.ni.com/devzone/cda/epd/p/id/1518).

I am sure that what I'm trying to make is simple enough for an experienced programmer to Labview.  However, my labview, C/C++ and experience is limited.

Thank you in advance for your help.

My labview and C code is found in the attached zip file.  However, the basic C code and output resulting are:

// Call DLL.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "Array_Multiply.h" #include  #include  #include  #include  #include  using namespace std; int main(int argc, char* argv[]) { TD1Hdl handle_var3; long temp; char stringout[25]; temp=25; handle_var3 = (TD1**)DSNewHandle(sizeof(TD1)); // initialize sizes (*handle_var3)->dimSize = 1; // // Gasstring is a function that outputs a Labview array of strings. // However, I can't make this work. All I am doing is outputting // memory addresses. // Gasstring(&handle_var3); cout << "\n gasstring " << *handle_var3; cout << "\n gasstring " << handle_var3; cout << "\n gasstring " << (*handle_var3)->String[0]; //cout << "\n gasstring " << (*handle_var4)->Numeric[0]); // // Gasstring3 is just a single string. There are no issues outputting // this string. // Gasstring3(stringout,temp); cout << "\n gasstring3 " << stringout; cout << " \n enter in number "; cin >> temp ; return 0; }

The output of my source code is:

I think I understood something :-)

cost < "\n="" gasstring ="" "=""> < lstrbuf(*(*handle_var3)-=""> String [0]);

There are some macros useful for LStrHandles in "extcode.h", LStrBuf is one of them.

It seems that there are no problems with memory management, you did it right.

Tags: NI Software

Similar Questions

  • Named Instance/Application DLL and LabVIEW FIFO

    Hi all

    I'm working on a logging of sensor application in LabVIEW 8.5.

    Each driver (written in LabVIEW) sensor has its own loop and a named FIFO correspondent the latest read values written in. One of the pilots use VISA for RS - 232 and another DLL call to a library that is interface with a USB - I2C converter.

    The main recorder reads all the of the FIFO, concatenates the data in chronological order they are sampled from the FIFO and writes in a combined log file.

    The third recorder that I add now must be written in C the nature of the sensor with it's interface. Each new data set that comes in will be written to the file. I would like to send a message in the C program to the main recorder that includes the name and the position of all writes data; This information will be concatenated in the main newspaper for purposes of time synchronization.

    My intuition first easy synchronization is to write a VI (compiled into a DLL by using the LabVIEW application builder and called from C) who will use a FIFO named to pass a string to the C recorder for the main recorder. But I don't know how the appointed FIFOs are shared between instances of the application.

    In other words, if I have a reference to FIFO named 'test' in a VI compiled and called as a DLL and a FIFO named "test" in reference to the Application Instance main (or specific application instance to the project running on the same Windows computer), point to the same structure? Alternatively, they are specific to each instance? If they are specific to each instance, what do you suggest me as a method to be less hassle to get data between instances of the application?

    Thanks in advance!

    Bradley Hughes

    My intuition first easy synchronization is to write a VI (compiled into a DLL by using the LabVIEW application builder and called from C) who will use a FIFO named to pass a string to the C recorder for the main recorder. But I don't know how the appointed FIFOs are shared between instances of the application.

    In other words, if I have a reference to FIFO named 'test' in a VI compiled and called as a DLL and a FIFO named "test" in reference to the Application Instance main (or specific application instance to the project running on the same Windows computer), point to the same structure? Alternatively, they are specific to each instance? If they are specific to each instance, what do you suggest me as a method to be less hassle to get data between instances of the application?

    Thanks in advance!

    Bradley Hughes

    Queues, semaphores etc. are not shared between all instances of the application (although they were in LabVIEW 8.0, but it really was a bug). But just because you call a DLL that uses a DLL of LabVIEW with a queue does not necessarily mean that you work in two different application instances. If however you intende to write an independent C program that runs in a separate way of the process you can certainly not connect to a queue of LabVIEW in this way. The LabVIEW DLL will be loaded in the runtime LabVIEW according to but part of your C program process.

    Even if it would make you a C DLL that you call your LabVIEW application and calls said LabVIEW DLL to communicate through the queue, you can be problem. This will not work unless the DLL of LabVIEW and the LabVIEW application that calls your DLL is written in the same version of LabVIEW. In this case, the DLL is loaded into the LabVIEW development system already running or in the case of a DBMS built in the running system. Once your main application LabVIEW and the LabVIEW DLL are not the same version, the DLL will be launched out of process in the enforcement system according to itself, that it really run in its own process.

    Rolf Kalbermatter

  • by passing the array of strings of Teststand to LV dll

    Hello

    I wonder, why is it not possible to pass an array of strings 1 d of TestStand to a dll, which is compiled with LabView. By the way the PropertyObject works very well, but as parameter category "Array of Strings" exist in the call dll TestStand pane, it should be possible to pass an array directly. I get an empty dialog box, where I try to view the contents of the array passed directly.

    Why it does not work?


  • Python, call DLLs in LabVIEW: Fatal internal error when accessing output String Cluster

    Hello

    We have compiled a DLL in LabVIEW (TestError.dll) and tried to call it from Python.

    TestError.dll includes 2 functions:

    1 testErreur: cluster 1 entry string, 1 channel indicator

    2 TestError2: 1 channel input, 1 bunch of output string

    What we try to do in Python is actually something like this:

    1 provide values to controls in the functions of the DLL.

    2. call the DLL.

    3 get the values of the indicators.

    What we have seen are:

    1 read/write operations on normal data types (string, digital) indicators/controls are OK

    2. write operation on the Cluster string entry is OK

    3. read operation on the Cluster output string is not OK. The following error is still prompted for:

    «Unrecoverable internal error: 'MemoryManager.cpp', line 437.» LabVIEW version 8.6... »

    Also joined the TestError.prj and python code.

    Grateful if someone can help to explain why we get this error and how to overcome?

    Thank you

    howmean

    What we have seen are:

    1 read/write operations on normal data types (string, digital) indicators/controls are OK

    2. write operation on the Cluster string entry is OK

    3. read operation on the Cluster output string is not OK. The following error is still prompted for:

    «Unrecoverable internal error: 'MemoryManager.cpp', line 437.» LabVIEW version 8.6... »

    Also joined the TestError.prj and python code.

    It is very logical that it does not, and the bad news is, it cannot really be implemented reliable of a process not LabVIEW.

    LabVIEW channels (and tables) are very specific species. They are then called handles, which are pointers to a pointer to a block of memory. If you have a control or indicator on its own, the Prototype configuration allows you to configure this setting as a C. LabVIEW data pointer, when creating the DLL, create heels C for each exported function and place the code to do the translation between the past C pointer to and necessary LabVIEW data handle. For strings and arrays within the cluster, there is no configuration option and the DLL is expected to pass a structure with data handles native LabVIEW in there.

    You may say that creating handles data in your calling process enough to trick LabVIEW. For the input variables that actually CAN sometimes work (but is a delicate and dangerous generally to handle this). There is no way to make it work for output variables. LabVIEW will try to resize handle to fill data in that he wants to make. This resizing is done using internal memory manager of LabVIEW. This will work only if it had been allocated by EXACTLY the same instance of the memory manager. Otherwise, it refers to a different memory segment and catastophally fail. The only way to make this work perhaps, with luck, taking your heart and prayer to the gods, is to lvrt.dll to allocate a handle that you must pass to the DLL. Still find the good lvrt.dll, which will execute your DLL LabVIEW is a major challenge.

  • Array of strings of text written in the worksheet in LabView 8.0

    Hello

    I've used LabView 8.5 to perform the next action, but as I am now working on another system I'm currently forced to use LabView 8.0 (Windows XP) and would like to avoid the upgrade to LV8.5 +. However if I can't do the following so I'll have to!

    I am wanting to create a worksheet and I use the 'Write to worksheet File.vi' block in LabView. However, as I want to have included column headers, I build an array of strings using the block 'building the table '. This table is then injected into the entry "1 D data" on the block "write to the worksheet. The format for the spreadsheet block is defined by a string with '%s' to enter the entrance of "Format". In LV8.5, the table connects well, but in LV8.0, when I connect the output of the array of strings to the 1 d data entry, the wire becomes broken. The same happens when I use the 2D data entry.

    If I don't do something wrong, how can I put headers in my spreadsheet file? Is it possible in LV8.0, or should I upgrade?

    Thanks for the help!

    There are also detailed instructions on the block diagram of the writing on a file spreadsheet on how to modify it to write strings. Be sure to save it under a new name and in a new location.

  • How to import an array of strings of labview in DIAdem spreadsheet/table

    How to set up a model of tiara so when you use labview express of tiara, the values are imported into a table.

    I have values such as gain, cut-off frequency and success/failure that exist in tables generated by the collection of information by a system of 7 EEG electrodes.  I want to create a table/worksheet in tiara that imports the data by using the DIAdem of LabVIEW express function, in a table or spread sheet?

    Notice to lovers?

    Hi eximo.

    The express block DIAdem report makes it easy fill the text boxes and the 2D graphics in DIAdem of variables (son) in LabVIEW.  Unfortunately no paintings 2D or 3D graphics are implemented in the express block DIAdem Rerpot.  So, you have 2 options.

    Option 1: If you do not have too many channels that you want to display, you can agree that several text boxes in the form of a 2D array and the use of the DIAdem report express block as it was planned (sending data to it by sons of LabVIEW).

    Option 2: at some point as you continue to add items to your report, you'll probably end up here.  The express block DIAdem report was designed to connect wires of LabVIEW with simple reports of DIAdem.  But there is a hook that you can use to run a VBScript script rather than load a REPORT model in DIAdem report express block *. File TDR.  With a DIAdem of VBScript, you can accomplish anything in tiara.  In addition to wiring up a way to VBScript instead of a path to the REPORT model, you will also need to send all the data you want to report on a TDMS file and have DIAdem read data from this file, instead of receive data directly from the LabVIEW of wire to the terminal of express block entry.  It's a little more complicated, but it will do absolutely everything you want in DIAdem and start this report of LabVIEW.

    I enclose an example of Option 2, but I'd be willing to help you adapt to your data and reporting needs if you are going to post or email ([email protected]) your data set and a rough *. File TDR that you want in the REPORT.  It's pretty slow here at the office at Christmas, so I have time...

    Brad Turpin

    Tiara Product Support Engineer
    National Instruments

  • Effective way to make and receive pointers with C/C++ DLLs in LabVIEW

    What is the best way to pass a handle using the dll programmed in Labwindows/CVI between call node of the Labview library?

    I read a very useful on post

    https://decibel.NI.com/content/docs/doc-9080/version/5 on and the reception of pointers with dll C in Labview.

    However, my request is for the Labview interface with a camera.  In the camera API, it defines

    #define void * CameraHandle

    And then a CamHandle variable should be used by a lot of other functions.

    In CVI, if not used as DLLs in Labview, I would

    Sub OpenCamera()

    {CameraHandle ;} CamHandle

    Sub SetParameter (CameraHandle CamHandle)

    {

    }

    void CloseCamera (CameraHandle CamHandle)

    {

    }

    If CamHandle is a type void *, how can I make it since one node/function in Labview when I use the Setup to call a library function?  In the post I read, it say how to get the value of the arrow tip using a pointer to the value, and then dereferencing pointer.  However, what I need, is to pass the pointer itself.

    Thank you very much!

    Best,

    Charles


  • String of DLLS in LabView in two strange characters

    Hello. I pass a string of DLLS in Labview and the result is correct, but there are two characters strange everytime "Gn".

    If the character that I spend is 'a', then the result is «a LARP»

    My DLL code is:

    void massiv_int(char *lv_ptr);

    _declspec (dllexport) void f_massiv (char hello []);

    _declspec (dllexport) void f_massiv (char hello []) {}

    char lv_str [10];
    char * lv_ptr;
    lv_ptr = & lv_str [0];

    massiv_int (lv_ptr);
    * Hello = lv_str [1];

    }

    void massiv_int(char *lv_ptr) {}

    char lv_local [10] = "abcdefg";
    memcpy (lv_ptr, lv_local, 10);
    }

    Could you tell me, what could be wrong?

    Thanks in advance.

    Try this:

    void massiv_int(char *lv_ptr);
    void massiv_int_NextLine(char *lv_ptr);

    LVSTR_API void f_massiv (char hello []) {}

    char lv_str [10];
    char * lv_ptr;
    lv_ptr = & lv_str [0];

    massiv_int (Hello);

    massiv_int (lv_ptr);
    * Hello = lv_str [1];
    }

    void massiv_int(char *lv_ptr) {}

    do lv_local as long as necessary (no extra characters)
    Char [] lv_local = "abcdefg";

    copies all of the characters in lv_local to lv_ptr
    strcpy (lv_ptr, lv_local);

    Add the following line
    massiv_int_NextLine (lv_ptr + strlen (lv_ptr));
    }

    void massiv_int_NextLine(char *lv_ptr) {}

    do lv_local as long as necessary (no extra characters, including LF)
    Char [] lv_local = "\nqwerty";

    copies all of the characters in lv_local to lv_ptr
    strcpy (lv_ptr, lv_local);

    }

    But make sure that the external string buffer allocated by LV is long enough to contain all the characters!

  • Return an array of strings of call library function node

    Hello

    I'm having a few problems getting the following work.

    I have a camera from a manufacturer that came with its own .dll and header files. I'm calling the LabVIEW .dll file (2011). In total, there are about 50 functions, and there is a rest that I can't go to work (probably because I understand enough about the topic to interface with an external code).

    The description of .dll is delivered with the following text:

    #define length

    #define MAX_CONFIGURATIONS

    Prototype: int ConfigListGet (char (& sConfigurations) [MAX_CONFIGURATIONS] [length]);

    and the header file with:

    extern "C" __declspec (dllexport) int RepRateConfigurationListGet (char (& sConfigurations) [MAX_CONFIGURATIONS] [length]);

    The function should return an array of strings to the list of configurations.

    The problem I have is that I can not understand how to return the array of strings for the node of the library function call to LabVIEW. I looked a little on the web and the examples in LabVIEW and I can't find anything specific to return an array of strings in this way, so if anyone can point me in the right direction I would really appreciate it.

    Also, if I click with the right button on the node library function call and click on "File Create.c", I would be able to create the prototype of function even that above? I tried this but no luck. Was the closest I came:

    int32_t RepRateConfigurationListGet (char sConfigurations [], uint8_t MAX_CONFIGURATIONS, uint8_t MAX_LEN);

    Thank you very much in advance for any help!

    D

    Hello!

    I tried once using an array of U8, converting it to a string and then split into an array.

    Here is my old piece of code (the split part can be cleaner ;=))

    Kind regards

    Marco

  • "The String to Byte Array" and its operations on-site (memory) of twins "Byte Array to string"? (or if they incur sentence of copy/memory operation?)

    I can't deduct the answer to this question (topic/post title) of the help of LabVIEW on the functions.

    Intuitively, it seems that the two representations of data are equal to the memory and so goes between the two should essentially be a no-op when the code is compiled... but is it? (assuming that the length of the array of strings/remains constant, can I go back repeatedly without performance?)

    As a string of LabVIEW is a handful and any other type of data except tables aren't a handful; that implies to me that a string = U8-table-grip handle and so a string into an array of U8-could be a memory or inefficient operation since no conversion actually take place?

    The reason I ask, is that when you work with for example TCP Read or read VISA, 'data' reading is always a string, but according to what you are doing, this string is often more efficiently processed/interpreted if converted to an array of U8 and I just want to know if (memory and CPU point of view) I can move freely between the chain and U8 array and return depending on what format is most appropriate to a point?

    (Also, I'm at this stage fairly certain that the "array of strings of bytes" is cleaner AND more efficient than a type-cast to an array of U8 strin... but I could be wrong.)

    I did some tests on this just now, and my conclusion is that it is completely in place. The local users group had a coding challenge when this became relevant to my solution.

  • Array of strings 1 d out of MathScript node

    I use arrays of cells inside a MathScript node and want to display an array of strings D 1.  I can't get output with this data type by selecting a column of string elements.  He seems to treat the strings as arrays of characters that are extremely difficult to work with.

    I've seen references 2008 who say that MathScript nodes cannot not out of arrays of strings,

    Is this always true?  Is there an example of how to get a string or some kind of workaround?

    My boss came up with a way to do it, as shown in the attached VI.

  • Convert an array of strings 1 d

    Hello

    I am creating headers in a write to a text file.  Attached, it's my code and the file looks like when opened in Excel. I have my data in three columns, but the headers are not where I need them. LabVIEW does not seem to allow a conversion of an array of strings. Is it possible that I can get the headers in a row format and not a column?

    Thank you

    Something like that.

  • Setting the size of the font of an array of strings programmatically

    I can't find the correct property to programmatically adjust the size of the font of an array of strings.  For a chain, it is quite easy with a property node and the text. FontSize property.  There must be a similar property to an array of strings, but I'm not.  Can anyone help?

    Take the element ref table and class type a more specific (string) and then you can set with a property node's font size.

  • Array of strings

    This should be an easy question. I try to use the "write to the spreadsheet" VI from Labview 8.0 but I need to change to accept arrays of strings, rather than arrays of doubles. 8.2 does it automatically, but I'm stuck using 8.0. The instructions in the block diagram of the original VI says:

    "You can change a copy of this VI to accept arrays of strings by changing data 2D and 1 d of channels tables data tables and defining the ├a %s format."

    I'm having a problem changing the tables of data in tables of strings. I looked in 'Properties' for an option and also looked in the 'representation '.

    How can I change the table of control digital channels? Thank you!

    Right-click on digital, then select "replace". Simply browse through the control of the chain on the pallet.

  • Call a C-built DLLS in LabVIEW

    Hello!

    I try to get knowledge on how to call DLLs in Labview.

    I found a very good example on this site:

    http://zone.NI.com/DevZone/CDA/EPD/p/ID/1513

    I downloaded and extracted the call_c_dll_in_lvnew.zipfile.

    When you try to open the sample file GenSortRandC.vi in the folder LabVIEW_code_and_DLL

    I get the following error message.

    "The procedure entry point not found RebootRTSystem in the library cvirte.dll dynamics."

    I searched on the Internet and some forums but so far without success.

    Could you please let me know if you have the same problem the example whith?

    I have the following configuration:

    -Labview 8.5.1 FDS (default installation)

    -Windows XP sp3

    Best regards

    Mattias

    Sweden

    Mattias salvation,

    I have no problem with this example. I can't run without error.

    It's maybe because I installed the CVI Run Time engine.

    Mike

Maybe you are looking for