Calling GetRawInputDeviceList function in LabVIEW
Hi,
I want to call GetRawInputeviceList function in the User32.dll using LabVIEW, but I am having difficulty in understandign the function prototype. To be specific, I am not clear what LabVIEW data types to be created for the arguments in the function. I went through this link http://msdn.microsoft.com/en-us/library/windows/desktop/ms645598(v=vs.85).aspx to understand the function prototype, but it is confusing.
Thanks
I created a LabVIEW Example based off of the example on the MSDN.
Most of the datatypes for this example boil down to unsigned ints 32-bit. See Windows Data Types for more info. It should also be noted that I use a hardcoded "8" for the sizeof(RAWINPUTDEVICELIST). This is because each of the child elements are 4-byte integers. You could check this by downloading Visual Studio and using "printf("%d\n", sizeof(RAWINPUTDEVICELIST);".
C++:
The following sample code shows a typical call to GetRawInputDeviceList:
UINT nDevices;
PRAWINPUTDEVICELIST pRawInputDeviceList;
if (GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVICELIST)) != 0) { Error();}
if ((pRawInputDeviceList = malloc(sizeof(RAWINPUTDEVICELIST) * nDevices)) == NULL) {Error();}
if (GetRawInputDeviceList(pRawInputDeviceList, &nDevices, sizeof(RAWINPUTDEVICELIST)) == (<dtype rid="UINT"/>)-1) {Error();}
// do the job...
// after the job, free the RAWINPUTDEVICELIST
free(pRawInputDeviceList);
LabVIEW:
In case the snippet doesn't work, I also attached the VI.
*Note: It should also be noted that my error checking is very minimal. I check for the "-1" output on the first call to the function, but I really should use the Kernel32.dll to call GetLastError() as necessary. This is obviously a simplistic example.
EDIT:
If you have any specific questions about the code or function prototyping, feel free to ask. I'll be honest, this example took me a long while to replicate. Getting the structure to pass correctly took some trial-and-error
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If someone helped you out, please select their post as the solution and/or give them Kudos!
Attachments:
GetRawInputDeviceList.vi 11 KB
Similar Messages
-
I am trying to call a function with LABVIEW developed in CCS compiler
I used MPLAB (CCS compiler) to develop c code that is used to transmit and receive messages to and from an automotive display. It works great as a stand alone. I would like to call this function from LABVIEW but am having difficulty doing so. Does anyone have experience calling a MPLAB developed project from LABVIEW? Thanks in advance.
MattPTE wrote:
I used MPLAB (CCS compiler) to develop c code that is used to transmit and receive messages to and from an automotive display. It works great as a stand alone. I would like to call this function from LABVIEW but am having difficulty doing so. Does anyone have experience calling a MPLAB developed project from LABVIEW? Thanks in advance.
Matt
MPLab is for programming PICs if I'm not mistaken. I'm not sure how you would want to call a function compiled in MPLab from LabVIEW directly. MPLab will create binary code for execution on PICs and there is no LabVIEW that could run on a PIC. On the other hand I didn't think you could create standard Windows DLLs, Mac shared libraries or similar in MPLab at all.
You will have to recompile your code in a C compiler that can create the standard shared library format for the plaform you want to call it from LabVIEW.
Rolf Kalbermatter
Rolf Kalbermatter
CIT Engineering Netherlands
a division of Test & Measurement Solutions -
Labview Dll call library function Causing Labview to unload
I am trying to use the Call Library function in Labview 7.1 to call an Init function for a Zathic Can4USB device. When I run the vi, it complete log LabView out of the computer. Can anyone tell me why the function totally unloads LV without displaying an error?
ThanksEither the function has a serious bug or you are calling it with
invalid parameters or wrongly setup parameters. The problem happening
here is that your DLL passes somehow invlid parameters to a system
device driver and that driver causes a protection fault. For device
driver execeptions which happen in the privileged kernel, Windows does
not try to attempt to message a user in such cases (other than the
threaded blue screen of dead which when you get it really means a full
restart) but unloads the current application as fast as possible.
Check the documentation for this function and try to see where you call
it srong or contact the developer of this DLL for assitence.
Rolf Kalbermatter
Rolf Kalbermatter
CIT Engineering Netherlands
a division of Test & Measurement Solutions -
Equivalent to calling a function in labview
Hi,
I don't use Labview regularly and would appreciate some advice for what is probably a straightforward problem! If I have one process started and running in a while loop, how can I start and run a second process in another while loop while simultaneously stopping the first while loop? For example, I have a button which when pressed turns on an indicator. When a second button is pressed the first indicator goes off and the second goes on simultaneously.
Thanks for your help.Nested Loops?
Edit to add: This is not the equivalent to calling a function like in C. The equavilant to calling a function in LV is to make a sub-vi. The sub-vi would be the same as a function. Place the sub-VI on another (higher level) block diagram and wire to it is like calling that function. -
Can i call winmain function in labview
hello everyone,
Well i have written a C++ code that uses the winmain function (windows function). i want to convert this code into dll and call that dll into labview.
Is it possible to call winmain function as one of the functions in labview. Please let me know as soon as possible.
Thank you.
Royal tiger......You didn't say what development environment you're using, so I'm assuming Visual Studio. It sounds like you created a Win32 app (as opposed to an MFC app). This has a "WinMain" function. The prototype for WinMain is geared towards it being called by the OS when you run the executable. You could just add the __declspec(export) directive in front of the return type, but you also need to change some build functions in Visual Studio to get a DLL. You probably also don't need all the arguments that WinMain uses. You're probably better off by starting with a new DLL project in order to get the framework for a DLL, and then copy and past the function code. That's what I would do.
I would also strongly suggest that you crack open the "Using External Code in LabVIEW" manual that gets installed when you installed LabVIEW. It's in the "manuals" directory, filename of "lvexcode.pdf". -
Calling DLL function using LabVIEW 7.1?
Here's the scinario:
I have LabVIEW 7.1 and i'm trying to call a DLL function using 'CALL LIBRARY FUNCTION NODE'.
I have used this in the past with no problem. But right now, when I use this node and link it to the
library and function name, i get 'ERROR loading Dllname.dll' message.
NOTE that the DLL is generated using VStudio2003 or VStudio.NET. Could this be a problem??
Also, i noticed that there are some JUNK characters before & after the function name that show
up in function prototype:
long ?EcpvsSign@@YAHHPBEH0HPAE1@Z(long Signer, CStr NonRMsg, long NonRMsgLen,
CStr RMsg, long RMsgLen, CStr SigR, CStr SigS);tbd wrote:
Hi rkpat,
You might check-out this thread on building WIN32 DLLs - expecially the bit re: "mangles names" under the paragraph titled "C Language Source File". My recollection is that 'extern "C"' directive in the header file for the DLL solved the name-mangling problem, but it's been a few years!
Cheers!
Message Edited by tbd on 03-01-2007 11:19 PM
tbd is right. You have to first disable name mangling as it creates all kind of troubles. Other issues might be that your Visual Studio 2003 or .Net edition links in dynamic runtime libraries that are not standard available on every Windows PC so that you need to redistribute the according runtime library installer together with your app for the DLL to be even loadable.
Rolf Kalbermatter
Rolf Kalbermatter
CIT Engineering Netherlands
a division of Test & Measurement Solutions -
Can not find size_t during import a dll and calling a function crash labview
Hello, experts
I need to use FingerLakeInstrument DLL ( see the attached) inside Labview to talk to a CCD camera. it is built from microsoft visual studio C++
I unzip FLI dll in my D:\proj\...\linfli-32 and import dll from there. created a c:\FLIDBG.txt as FLI dll needs to write debug message to it if FLISetDebugLevel() or others are called.
During importing the dll, first thing I got is <sys/types.h> ( ie size_t ) cannot be found. I have installed free version of microsoft visual studio C++
but can not find "typedef unsigned int size_t"
at the end, I just added
typedef unsigned int size_t;
in the libfli.h. Having done that, I am able to import all functions into Labview and have a user library called libfli.
However, as soon as I start calling a simple function in a test.vi, such as FLIGetLibVersion(char* ver, size_t len), which involves nothing other than the library, the labview will crash.
I created a simple C test.exe which calls many functions without any problem
any suggstion?
regards
xiaofeng
Solved!
Go to Solution.
Attachments:
libfli-32.zip 93 KBHi, Smercurio_fc
thanks for your reply. Yes, you are pointing to the right place. I have solved the crash problem.
when importing DLL into Labview using Tools\import\Shared Library (.dll), Labview automatically set the calling convention as C not as stdcall (WINAPI). it is this that later the labview crashes when a function is called. as soon as I manually re-selecte calling convention as stdcall, my test.vi works OK (see attached).
I tried Call Library Function too to call libfli.dll, as long as I select stdcall as call convetion. the test.vi works.
How do I know which Call convention I need to choose if there is no infomation from DLL provider?
as for the size_t,
I add #include <crtdefs.h> in libfli.h and
add additional include path as
C:\Program Files\Microsoft Visual Studio 10.0\VC\include. this solved the "not found" issue.
for this case I know that the DLL is built from VC++, is this right way?
again, thanks for your time.
xiaofeng
Attachments:
test.vi 13 KB -
I have a function from a dll that return a double* string and an integer. How can I call this function from LabVIEW? There is a possibility to work in LabVIEW with a double* string?
pcbv wrote:
> Hello all,<br><br>The header of the function is:
>
> "HRESULT WRAPIEnumerateDevices(WRAPI_NDIS_DEVICE **ppDeviceList, long *plItems);"
>
> where WRAPI_NDIS_DEVICE have this form:
>
> typedef struct WRAPI_NDIS_DEVICE<br>{<br>
> WCHAR *pDeviceName;<br>
> WCHAR *pDeviceDescription;<br><br>}
> WRAPI_NDIS_DEVICE;<br><br>
>
> The function is from WRAPI.dll, used for communication with wireless card.
> For my application I need to call in LabVIEW this function.
Two difficulties I can see with this.
First the application seems to allocate the array of references
internally and return a pointer to that array. In that case there must
be another function which then deallocates that array again.
Then you would need to setup the function call to have a pointer to an
int32 number for the deviceList parameter and another pointer to int32
one for the plItems parameter.
Then create another function in your DLL similar to this:
HRESULT WRAPIEnumExtractDevice(WRAPI_NDIS_DEVICE *lpDeviceList, long i,
CHAR lpszDeviceName, LONG lenDeviceName,
CHAR lpszDeviceDesc, LONG lenDeviceDesc)
if (!lpDeviceList)
return ERROR_INV_PARAMETER;
if (lpDeviceList[i].pDeviceName)
WideCharToMultiByte(CP_ACP, 0,
pDeviceList[i].pDeviceName, -1,
lpszDeviceName, lenDeviceName,
NULL, NULL);
if (lpDeviceList[i].pDeviceName)
WideCharToMultiByte(CP_ACP, 0,
pDeviceList[i].pDeviceDescription, -1,
lpszDeviceDesc, lenDeviceDesc,
NULL, NULL);
return NO_ERROR;
Pass the int32 you got from the first parameter of the previous call as
a simple int32 passed by value to this function (and make sure you don't
call this function with a higher index than (plItems - 1) returned from
the first function.
Rolf Kalbermatter
Rolf Kalbermatter
CIT Engineering Netherlands
a division of Test & Measurement Solutions -
Can LabVIEW call a function from a .sys file or is LabVIEW limited to dll access?
My vendor has sent me a .sys file with functions accessing their hardware. Can i call these function from labview directly or do I have to wrapper the .sys with a dll?
Well a sys file is a kernel device driver. LabVIEW does not have any direct way of accessing such a driver. The way kernel drivers are accessed is usually through a DLL which makes calls to WinAPI functions such as CreateFile(), ReadFile(), WriteFile(), CloseHandle() and DeviceIORequest(). Since these WinAPI calls are basically just DLL calls too, you could theoretically use the Call Library Node to call them and access the kernel device driver in such a way.
However for any kernel device driver with more than one or two device driver calls, it will certainly be easier in terms of development, debugging and maintenance of the code, to write actually a dedicated DLL in C/C++ for this device driver and access that DLL from LabVIEW, especially if you consider the LabVIEW datatype limitations when designing the DLL interface (Basically this same DLL can then be called from any other Windows development environment, be it Visual Basic (similar datatype limitation as LabVIEW), Delphi, (Visual) C, LabVIEW or also various scripting environments like Python and Lua.
Some of the necessary WindAPI calls are rather involved and pose quite a bit of trouble to get the parameter data right in LabVIEw.
Rolf Kalbermatter
CIT Engineering Netherlands
a division of Test & Measurement Solutions -
I am using an ActiveX function that has following format (in C++)
HRESULT GetLuminanceImage([in] long aMax,
[out,size_is(aMax)] float fBuffer[],
[out, retval]short *sRet);
How can I call this function in labview.
I need to know how to define the parmaters in Call library function node in Labview
Thanks in advance.
-SK
Message Edited by CKSlv on 01-20-2006 03:11 PMHi Lycangeek ,
I got stuck in the same kind of problem , I am using Automation open to load my COM library.
My Com dll is having an exposed function like
CAN_Write([in]long ID,[in] long DLC, [in,size_is(DLC) unsigned char* Data,[out,retval]long *pRetStat);
But when i am calling this function using automation invoke node in labview the Data is not a pointer reference its just accepting unsigned char Data . Can you please let me know how shall i pass the data to this array?? Or shall i need to change my DLL function...
Thanks in Advance. -
Calling DLL using "Call library function"
I am trying to combine labview with my previous fortran functions using Intel Visual Fortran 12.1 and labview 2012 by below steps.
1. Compile Fortran functions as DLL file.
2. Call Fortran function from LabView via "Call library function"
In step 2, DLL file without linker option "/DLL delayimp.lib" cannot be loaded. That is "delay load" is needed for DLL file.
Are there any limitation or constraint in Call library function?Hi Vishnu,
There's no problem using the Malloc function in C and call it as a DLL in LabVIEW.
But LabVIEW has a different memory management than C.
It is probably not recommended to allocate array memory in C for labVIEW arrays
You can use initialize array in LabVIEW instead.
Good luck
Van L
NI Applications Engineer -
Call function in LabView from a DLL, then access global variable from DLL
I have created a DLL in LabWindows with a function and a structure. I want to call the function from within LabView and then access the global structure. I am able to call the function from the DLL with a "Call Library Function Node" and can access the return value, but I cannot figure out how to access the global structure. The structure is declared in the DLL header file with __declspec(dllimport) struct parameters.
Is there any way of accessing this structure without using the Network Variable Library?
Solved!
Go to Solution.dblok wrote:
When you say "access to" or "the address of" the global variable, do you mean to pass the variable as an argument to the function call in the DLL? If so, then I was not really sure how to pass a cluster from LabView by using the "Call Library Function Node".
Yes, that's exactly right. I would include a pair of helper functions in the DLL to read and write the global variable. Alternatively you might write separate helper functions for each field inside the global structure, depending on the number of fields and whether you want to do any validation on the values.
You can pass a cluster by reference to a function that expects a struct by setting the parameter to Adapt to Type, so long as the cluster does not contain any variable-length elements (strings or arrays). The cluster needs to match the struct exactly, and sometimes that involves adding extra padding bytes to make the alignment work. Variable-length elements in LabVIEW need to be converted to clusters containing the same number of elements as the struct definition (for example, if your struct contains char name[12], you would create a cluster of 8 U8 values, and you could use String to Array of Bytes followed by Array to Cluster to convert a LabVIEW string into that format). If the struct contains pointers it gets more complicated, and it may be easier to write functions in the DLL to access those specific elements individually.
If you can't get this working or need help, post your code and an explanation of the error or problem you're seeing.
EDIT: it is also possible to include a single function in the DLL that returns the address of the global variable, which LabVIEW can then use to access and modify the data, but that's more complicated and likely to lead to crashes if you don't get the memory addressing exactly right. -
Hi, I'm trying to use a .DLL I wrote in Visual C++ .NET. The Call Library Function generates a function prototype of "CStr Parser(CStr arg_raw)"
but my compiler won't accept this. So I change it to how C normally deals with strings "char *Parser(char *arg_raw). Now the Call Librafy Function does not find "Parser" in my .DLL though it is definitely there!
Help!
-FongHello
You will need to include extcode.h in your C file. You can find this under ..\LabVIEW\cintools folder.
The include has all the defines you will need.
Bilal Durrani
NI
Bilal Durrani
NI -
Can I call a built in LabVIEW function remotely?
I would like to call a bunch of LabVIEW's built in GPIB functions on a
remote computer to talk to a device attached to that computer. I was
able to do this using VI server and by wrapping the GPIB function in a
custom vi (this vi was just GPIB Write with controls and indicators)
Is there a way to avoid making a "wrapper" VI for built in functions
such as GPIB Write? i.e Open a VI reference to built-in LabVIEW
functions remotely using VI server?
Thanks,
Brian
Sent via Deja.com http://www.deja.com/
Before you buy.That is one of the built-in functions and not a stand-alone VI and the best way to call it is to create a VI with it on the block diagram.
-
How to implement a callback function using LabView's Call Library Function Node?
I am trying to call a fuction from a SDK.dll library using the Call Library Function Node. The SDK was provided to
me and I do not have the source code, just the .dll and .h files.
The SdkSetPropertyEventHandler function has a callback fuction as one of its parameters. How do I implement the
callback using the CLF node? I am a good LabView programmer but this is my first time using the Call Library
Function Node. I have read all the info I can find on NI's web site and the discussion board but cannot figure
this one out. I am using LabView 8.6.
The SDK.h deacribes the function as:
// Function: SdkSetPropertyEventHandler
SdkError SDKAPI SdkSetPropertyEventHandler(
SdkCameraRef inCameraRef,
SdkPropertyEvent inEvnet,
SdkPropertyEventHandler inPropertyEventHandler,
SdkVoid* inContext );
// Description:
// Registers a callback function for receiving status
// change notification events for property states on a camera.
// Parameters:
// In: inCameraRef - Designate the camera object.
// inEvent - Designate one or all events to be supplemented.
// inPropertyEventHandler - Designate the pointer to the callback
// function for receiving property-related camera events.
// inContext - Designate application information to be passed by
// means of the callback function. Any data needed for
// your application can be passed.
// Out: None
// Returns: Any of the sdk errors.
A separate header file called SDKTypes.h contains the following data:
typedef SdkUInt32 SdkPropertyEvent;
typedef SdkUInt32 SdkPropertyID;
typedef void SdkVoid;
typedef struct __SdkObject* SdkBaseRef;
typedef SdkBaseRef SdkCameraRef;
SdkPropertyEventHandler
typedef SdkError ( SDKCALLBACK *SdkPropertyEventHandler )(
SdkPropertyEvent inEvent,
SdkPropertyID inPropertyID,
SdkUInt32 inParam,
SdkVoid * inContext );
Thanks for your help.
Alejandro
Solved!
Go to Solution.alejandroandreatta wrote:
I am trying to call a fuction from a SDK.dll library using the Call Library Function Node. The SDK was provided to
me and I do not have the source code, just the .dll and .h files.
The SdkSetPropertyEventHandler function has a callback fuction as one of its parameters. How do I implement the
callback using the CLF node? I am a good LabView programmer but this is my first time using the Call Library
Function Node. I have read all the info I can find on NI's web site and the discussion board but cannot figure
this one out. I am using LabView 8.6.
Basically you do not do that. LabVIEW does not know pointers and certainly not function pointers. What you should do instead is writing a C DLL that implements the callback and also exports a function to be called by LabVIEW that translates between the callback and a LabVIEW user event. Look for PostLVUserEvent() here on the NI site to find examples how to do that.
Rolf Kalbermatter
Message Edited by rolfk on 02-11-2009 08:00 PM
Rolf Kalbermatter
CIT Engineering Netherlands
a division of Test & Measurement Solutions
Maybe you are looking for
-
PR not generated when multiple lines added to work order
Hello Guys, I am facing issues when I tried to add multiple non stock components to generate PR. I have added around 20 non stock components with "N" as item category along with text description only ( Component field was blank). When I save the WO,
-
Can't find photo files.
I have been looking for the individual photo files on my computer. When I open the "Pictures" folder the only option that I am given is iPhoto. If I click on it, it opens iPhoto but does not show the individual files. I have used the finder to sea
-
is the JVC everio GZ-HD7 compatible with fcp?
-
Mass update of mixing ratios for new fiscal
Hello All, Is there any way to update mixing ratios for a new fiscal in a mass manner? What would be the best way to do a mass update? Thanks. Regards, SB
-
When I now click on any of the Angry Birds I updated, it tries to load, but then goes back to my home screen. I have tried restarting and relodading the iPad. What else can I do? Thanks.