use a C++ DLL in LabVIEW

I have a DLL that has been written in C++, and the typedef in C++ code is defined as:
CY_BUFFER
Definition
typedef struct
{
int size;
char * data;
} CY_BUFFER;

There is a function that should return the number of version as shown below:

C function
Version CY_INT (CY_BUFFER * buffer);

A sample of code C to write to call the DLL is listed here:
Example in C
#include "cy_runtime.h".
const int CUDA_DEVICE = 0;
If (Initialize (CUDA_DEVICE)! = CY_SUCCESS)
Returns - 1;
Buffer CY_BUFFER;
If (init_buffer(&buffer)! = CY_SUCCESS)
Returns - 1;
If (version (& buffer)! = CY_SUCCESS)
Returns - 1;
If (free_buffer(&buffer)! = CY_SUCCESS)
Returns - 1;

I have built wrapper LabVIEW using the DLL import wizard, but may not know what I have to do. I read the pointers to C/C++ dll dereferenciant in LabVIEW, but I do not understand how to use. Y at - it someone who can point me in the right direction here.  I can't edit the C++ DLL, but I don't know in theory, only the types of data, I just may not know what the wizard trying to do when he created the GetValueByPointer VI code it generates automatically.  If its C++, do I need to not use the wizard at all and create from scratch?  Any help would be appreciated gratefully.

In addition to what Nathan said, you probably have an alignment problem. C compilers tend to align the elements in a struct to their inherent normal size. This means that the char pointer will be aligned to 4 bytes when you use LabVIEW 32 bits and bytes 8 when you use LabVIEW 64 bit. Now since the DLL also provides the init both the free function, this makes things a little easier. You can simply create an array of 4 integers from 32-bit bytes, pass it as a pointer to array to the function init() and version() free() and the only thing you need to do before release called an additional function of MoveBlock() where you adjust the offset in this table for the number of bits of LabVIEW.

This involves a number of things:

(1) your struct is indeed using 8-byte alignment, which causes the pointer to the byte offset 4 in for 32-bit LabVIEW and structure at byte offset 8 for 64-bit LabVIEW. Are you of any changes by using 64-bit LabVIEW, now that you have these 4 additional elements of the cluster between the size and the pointer?

(2) in fact, the size in the struct element specifies how much data is in the buffer tank.

And for the functions of the DLL error handling was completely omitted. To match the C code, you have shown that you should always check the function returns the value too before continuing.

Tags: NI Software

Similar Questions

  • Cannot use MATLAB MCR DLLS in LabVIEW

    General information:

    We would like to call a Matlab compiled DLL, which is based on the duration of the compiler Matlab (MCR), LabVIEW. We also want to use the LabVIEW Vision of data collection software. Use a map OR frame grabber is installed, and a camera is connected to the card. We were using an evaluation version of LabVIEW to see if you can solve this problem. We tried two versions of LabVIEW 8.6 and 2010.

    The problem:

    The installation program of LabVIEW place dll in the system32 folder. The names of some of these DLLs are generic enough. LabVIEW vision software includes tbb.dll in the System32 folder. Execution of the Matlab compiler also includes a tbb.dll, not in system32, but in it's own application directory. LabVIEW DLL / so everybody, which is kind of rude, but little matter which at the present time. The biggest problem is when I try to use Matlab in the same process as LabVIEW Vision. It is not possible to do so, because the names of DLL in conflict between them, and I have no control over the source or Matlab and LabVIEW code to allow them to be charged with the full path name.

    For this reason, we can use the LabVIEW software to solve our specific application.

    Hi marcus,

    R & D is aware of this problem and it has already been established as part of the Corrective Action that requires #245249. You can watch the future versions of LabVIEW release notes to see when it is fixed.

  • 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.

  • Problem of memory, then I import a DLL on LabView 2010

    Hello

    I have a lot of problems with importing a file .dll on labview.

    The blocks of import to the third of fourth function and sometimes a textbox appear (as you can see in attachment).

    I tried with the import node, but it does not work (so maybe it's that I don't know how to use it really).

    I don't really know how to import the entire library, and I am really stuck.

    There is also the header and the dll as an attachment.

    Thanks for your interest.

    I didn't say it's impossible, but it is very likely well above your head. You probably have two options:

    (1) to abandon this material and get a part that has a good support for LabVIEW.

    (2) hire someone with a very good understanding about LabVIEW C interfacing and allow them to create a VI library and interface DLL for you.

    Good luck

  • Calling DLLS in LabVIEW

    Hello

    Below is the code written in LabWindows in which dynamically access a Dll using Windows API LoadLibrary(), GetProcAddress(), and FreeLibrary().

    Successfully, I could load the library and get the procedure address using library calls node in LabVIEW. But got stuck after that.

    As I am not good in C/C++ coding, ask someone to really help me to write the same thing in LabVIEW.

    Kindly do the needful.

    #include   // Function prototypes.
    #include     // CVI Active X definitions.
    #include 
    #include    /* Needed if linking in external compiler; harmless otherwise */
    #include 
    #include 
    
    typedef long __stdcall( *OLECREATEOBJECT)(char*);
    static  HINSTANCE  Hinstlib;
    static  long  gvntISystem;
    
    long CviCreateFastObjects (void)
     {
    OLECREATEOBJECT procAdd;
        pStrTempmem      = (char*)CA_AllocMemory(1);
        Hinstlib = LoadLibrary("FastTrio");
        if( Hinstlib != NULL)
    {
            procAdd = (OLECREATEOBJECT) GetProcAddress(Hinstlib, "OLECreateObject");
            if(fRunTimeLinkSucess = (procAdd != NULL))
    {
            gvntISystem = (procAdd)("FAST.IMFASTSystemInterface");
            return 0;
            }
            else
            return 1;
            }
        else
            {
    return 1;
            }
    }
    

    All the information you need are in the C code.

    • OLECREATEOBJECT is typedefed just after all the #includes at the top.  It returns a long integer (typically I32 in LabVIEW, but could be I64 on a 64-bit operating system) and takes a string as input.  It uses the standard windows calling conventions, not the C calling convention.
    • LoadLibrary and GetProcAddress are used to get a pointer to the function (procAdd).  This is handled in LabVIEW, by filling in the location of the library and the function in the call library node.
    • The library of appeal in LabVIEW node must also be set to the standard calling convention and return value (I32) and list of parameters (a string) must be set.
    • the function is used to set gvntISystem with a constant of entry 'FAST. IMFASTSystemInterface ".  In LabVIEW, a constant string of wire at the entrance and read the return value.
    • You can implement the audit, thus using the call library errors node error output.

    Good luck!

  • Return the execution of DLLS in Labview data table

    Hi all

    I have a DLL C++ which should run continuously collect new data of some hardware.

    I can call the DLL without any problem of Labview, but I wish I had access to some digital table data in the DLL in Labview (the appellant or an another VI) during its execution.

    Working in this direction, I've already got the event validation works, i.e. trigger messages to the DLLS running in VI of the caller using PostLVUserEvent().  This would solve my problem (maybe bad) if I need only a scalar or string of each event (which works fine).

    Then I tried passing a few paintings of small integers via the event (properly by changing the input type to create the user in LV event), but it did not work (empty tables or falls down... oops!).  Perhaps events are not the way to send large paintings (say 10 ^ 4-10 ^ 5 integers) anyway...

    Can anyone suggest a way to do this?  There are functions to manipulate the values in a control of LV/indicator of the DLL running?

    Thanks a lot for any assistance, MT


  • DLL Interop.LabVIEW

    Where can I get a copy of the DLL Interop.LabVIEW for use with c#, or do I have to write my own?


  • 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


  • How to include a .lvlib in a generation that was created using a custom .dll file

    I am trying to build an executable in LV2010 which uses a .lvlib which was created using a Keyence .dll file. I added the .lvlib to the source as "Still included" files and I also added all the files "Always included." library .vi I always get the error message saying "Lack the external function" during the execution of the program. The executable seems to open properly on the development computer, but not on a secondary computer. Any ideas?

    Hi Harris,

    I would like to clarify a few points.

    -With all these configurations that you described above, the executable file worked properly on the development computer?

    -L'application works correctly on the development computer outside a build specification, just running in LabVIEW?

    -Have you tried to deploy the executable on multiple computers, and you see the same error on every computer other than the development computer?

    -Is there a software that must be installed so that the TMIF.dll to work? This software is installed on the deployment computer?

    It seems that the DLL is included with success, but for some reason, the function appears as missing. Also, I noticed that the error message has a: C at the end of the message, which makes me wonder - is this a C DLL or a Windows DLL (.NET)?

  • 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.

  • 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

  • Hide icon Label step using the API Testand and LabVIEW

    Hello

    can someone tell me how it is possible to hide the icon of a step label using the API Testand and LabVIEW?

    In the Teststand sequence editor, under the Label Edit tab there is a checkbox called "Hide icon". Is there something similar in the API?

    Thank you

    Yes you can, you must set the stage "ni_blank.ico" IconName property

  • Load a complex DLLs in Labview

    Hi guys:

    I need to load a dll into labview, the prototype is:

    running long (const char a [],
    const double b,
    const int c,
    double d [5] [23],)
    Double e [4],
    );

    I put the prototype in labview is:

    Uint64_t function (const CStr has,

    const double b,

    const int32_t c,

    Array2DDouble * d,.

    Double * e);

    but the function does not work, I suppose that it maybe some concern to the parameter d, the attached file is the config box,.

    Someone tell me where is the problem?

    Thank you

    Good news. I have fix

  • 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

  • use data tpye I64 in labview 7.1

    Hello

    I update a former program and must use data tpye i64 in labview 7.1, but only support labview 7.1 i32.

    So how to use i64 in labview 7.1, thanks for your help.

    Sonic

    Hey sonic.

    as LV7.1 does not support 64-bit by default integers, you could

    -store 64-bit entities in a cluster containing a high and a low 32 bits longword

    -make your own mathematical routines (unless the +, -, *, / are easy to incorporate) emulating math 64 bit with 32-bit integers

    -Read papers on how old 8-bit processors emulated math whole 32-bit...

Maybe you are looking for

  • File formats

    Can someone tell me if the 3D data captured via the germs can be exported as wrl, obj, or stl file? If this isn't the case, Sprout files can be imported into 3D Studio Max, manipulated and then exported to print via a 3D printer? Thank you

  • How can I delete a print application

    Somehow, I started an app impression that I don't want, and it prints a newsletter whenever I start the printer and print an e-mail or other document. How can I delete a print application, in this case, the Sunday Times Digest.

  • Company e-mail blackBerry Smartphones is the only option in the configuration

    First post on this forum, so please bear with me until I get how it works. I bought a Blackberry Torch 9800 a dealer and tried to setup email but the only option available is undertaken. The carrier, O2, can't help. How can I get all the email option

  • Names of files Adobe Player?

    I have a few machines Windows 2012 R2 that are shipped with built-in support for Adobe Flash in my lab. On some systems, Flash.ocx & FlashUtil_Activex.dll, while on some systems, I have NPSWF64_11_6_602_171.dll & NPSWF32_11_6_602_171.dll.I know this

  • Cannot start the unique virtual machine after you have patched ESXi to 4.1.0 800830

    I patched a standalone ESXi host yesterday, leading a successful ESXi 4.1.0 800830 upgrade.The majority of my virtual machines started very well but it fails to start with the following error (as the specified file does not exist (?)). As I've not me