Call DLL function with pointer to simple struct
Hello,
I try to call a function using CLFN. My problem is the parameters of the function I try to access.
Here is the function and his parameter:
typedef struct {
int major;
int minor;
int revision;
int build;
} VersionNumberType;
int Comm_BTE_softVersion( VersionNumberType *pVersion)
BYTE byBuffer[2048] ;
if( !Comm_BTE_readYMem( byBuffer,COMM_BTE_TX14_SOFTVERSIONADDR,
COMM_BTE_TX14_SOFTVERSIONSIZE))
return FALSE ;
//. process the answer
pVersion->major = (int) (byBuffer[0] & 0xFF) ;
pVersion->minor = (int) (byBuffer[1] & 0xFF) ;
pVersion->revision = (int)( byBuffer[2] & 0xFF) ;
pVersion->build = (int) ((int) ( byBuffer[4] << 8) ) | ((int) ( byBuffer[5] ));
return TRUE ;
} //. end Comm_BTE
In attached file there is the Comm BTE soft Version.vi that try to access this function. The code crashes when the function is called and labVIEW is closed.
I probably don't pass the data parameters correctly to the CLFN.
Thanks for help.
Regards. NewCLAD.
Solved!
Go to Solution.
Attachments:
Comm BTE soft Version.vi 13 KB
Everything is configured correctly EXCEPT the numeric representation of the values in the cluster. They must match int, which is most likely 32 bits on your platform. In your VI, they are U8.
Similar Messages
-
Is it possible to call dll-functions with records/types as arguments?
or must I use the fixed preselection of types
LabVIEW must call DLLs with data types it is compatible. Therefore, you must use the types available through LabVIEW.
I have two pieces of advice on this matter:
First, contact NI and get their advice on how to call your data type. They may be able to offer a very quick solution.
Second, if you cannot call these data types, and you have a compiler, I would suggest "wrapping" the DLL inside another, and 'translate' the data type from something LabVIEW can handle, to the type needed by your DLL in this 'wrapper' DLL. -
Allocate memory and call dll function which writes to the pointer
Hi!
I have a DLL wich has a function like the following example, wich i need to call from labview. In C I need to allocate some memory for the data and of course the struct. I add the pointer and the lengh of the data to the stuct and call the function with the struct. The function itself inserts some values to the stuct and to allocated memory. Has someone a working solution how this can be done with Labview?
typedef struct Thestruct
UINT16 val1;
UINT8 val2;
UINT8 val3;
UINT16 dataLength;
UINT8 *data;
} T_Thestruct;
MY_API Status MY_API_CALL udaReceive(Handle handle, T_Thestruct *args);
I tried in labview (see picture), but I only got values inside the struct as well as the error 1097, the reserved memory inclues the same values as before.
Solved!
Go to Solution.
Attachments:
CallDll.PNG 21 KBTobias_BSH wrote:
OK, I found the soluton to my own Problem. The alignment on the struct must be corrected in Labview. There must be a 2Bytes dummy value between dataLength and the pointer.
And please not that your solution only works in LabVIEW 32 bit. In LabVIEW 64 Bit your DLL has to be 64 bit compiled as well in order to be loadable and the pointer then is a 64 bit integer and is usually aligned to 64 bit addresses too. In this particular case since the pointer is already aligned to a multiple of 64 bit (when the additional 2 alignment bytes are added) you won't have to modify the alignment for the 64 bit case, but you have to define a different cluster with the 64 bit integer for the pointer anyhow.
Rolf Kalbermatter
CIT Engineering Netherlands
a division of Test & Measurement Solutions -
HI!
What's the best way (and simple) to call DLL function from JAVA.
DLL function (developed in C) has two input parameters (string) and return an integer.
Could you help with an example?
Thanks a lot.Do a google search for 'JNI tutorial' and it will turn up hundreds of examples.
-
Application crashes when calling DLL built with LabVIEW 2011
Hello everybody,
Our application calls DLLs built with LabVIEW 2010 SP1. We installed LabVIEW 2011 and built some DLLs. So far so good. If we start our application and run 2010 DLLs it still works fine. If we run a 2011 DLL just once no error happens, but if we try to run the same 2011 DLL our application crashes reporting the error below. I saved the code for 2010 version and built a DLL and it works fine. Does anyone know why?
Thank you in advance.
#Date: Fr, 16. Sep 2011 16:25:25
#OSName: Microsoft Windows XP Service Pack 3
#OSVers: 5.1
#OSBuild: 2600
#AppName: PasTA
#Version: 11.0f2 32-bit
#AppKind: AppLib
#LabVIEW Base Address: 0x30000000
16.09.2011 16:25:26.181
Crash 0x0: Crash caught by NIER
File Unknown(0) : Crash: Crash caught by NIER
minidump id: 8a779b3f-51d7-4864-8e4d-6ab0195cd158
ExceptionCode: 0xC0000005
N
0x3072C804 - lvrt <unknown> + 0
0x3072CBB8 - lvrt <unknown> + 0
0x7C864191 - KERNEL32 <unknown> + 0
0x7C83AB50 - KERNEL32 <unknown> + 0
0x00000000 - PasTA <unknown> + 0
Attachments:
error.PNG 11 KBOn that note, you should be able to create DLLs in 2010 and run them with 2011, correct?? In my case, I have a 2010 built DLL (talking to sbRIO), most of the functions work when run in 2011, but a couple of them lock up LabVIEW on the desktop (but not the sbRIO), no lock ups happen with 2010 on the desktop.
-
How to call a function with pl/sql
How does one call a function with pl/sql that uses a function?
Hi,
How does one call a function with pl/sql that uses a
function?I'm not sure what you mean.
In PL/SQL function can be used just about anywhere where an expression (with the same data type that the function returns). Arpit gave a very common example.
Here's another example, where all the functions take a single NUMBER argument and return a NUMBER, so they can all be used in places where NUMBERs are used:
IF fun_a (fun_b (0)) < fun_c (1)
THEN
UPDATE table_x
SET column_y = fun_d (2)
WHERE column_z = fun_e (ROUND ((fun_f (3), fun_g (4)));You call a function simply by using its name, followed by its argument list, if any.
If the function is in a package, you must call it with the package name, like "pk_foo.bar (1, 2, 3)", unless the call comes from within the same package.
If the function is owned by someone else, you must give the owner name, like "scott.bar (SYSDATE)" or "scott.pk_foo.bar (1, 2, 3)". You can create synonyms to avoid having to name the owner. -
Call outside function with same name in a package
I created a function as follows:
create or replace function f1 return number
is
begin
return 1;
end;
This f1 is to be called in a package created below.
Then I create a package with a function in it, as follows:
create or replace package pack1 as
function f1 return number;
end;
Now I define the package body as follows:
create or replace package body pack1 as
function f1 return number as
-- I am trying to call the first function f1 defined above here
How do I resolve the name issues here?
In other words, I want to call a function with the same signature outside a package.
Thanks for your kind help.Hi,
Welcome to the forum!
Do you have a good reason for using the same name?
Refer to the stand-alone function with the owner name, even though it's your current schema.
That is, even if the package and the stand-alone function are owned by scott, in the package, say
x := scott.f1; -
Is there a way to call a function with in the initializer of a ArrayCollection?
Is there a way to call a function with in the initializer of a ArrayCollection?
It won't let me do this:
var ac:ArrayCollection = new ArrayCollection([
{childName:'addTrade',index:addTradeIndex },
{childName:'tradeList',dealsCanvas.getChildIndex(tradeList) }The correct syntax is
var ac:ArrayCollection = new ArrayCollection([
{childName:'addTrade',index:addTradeIndex },
{childName:'tradeList',index:dealsCanvas.getChildIndex(tradeList) } -
How to call a function with event
How do I call a function with a event inside it?
function showTopTen(e:Event):void
highscoreData = new XML(e.target.data);
trace("Hiscores: " + highscoreData.item[0].name.text() + " - " + highscoreData.item[0].score.text())
//showTopTen(); ..??Could you indicate why you would want to?
The eventhandler you show here uses the properties of the event object passed as an argument.
The way I read it it is data retrieved from a server so your app won't know anything about is untill it is loaded from the server which should be done with an URLLoader object which in it's turn calls your eventHandler when the Event.COMPLETE is triggered.
something like:
var urlLoader = new URLLoader();
urlLoader.addEventListener( Event.COMPLETE, showTopTen )
urlLoader.load( new URLRequest( "http:// etc." ) );
to me would seem the proper method to have the function execute. -
How to call java function with parameter from javascript in adf mobile?
how to call java function with parameter from javascript in adf mobile?
The ADF Mobile Container Utilities API may be used from JavaScript or Java.
Application Container APIs - 11g Release 2 (11.1.2.4.0) -
How to call LabView function with nested structs and arrays from C#
Hi,
I've got the following functions defined in a LabView-dll:
uint32_t __stdcall VOSC04_General(uint32_t Command, TD18Hdl *Messages);
uint32_t __stdcall CheckDiameter(uint32_t Command, TD6 *Parameter);
typedef struct {
double SP_Diameter;
double SP_Tolerantie;
double PV_Diameter;
} TD6;
typedef struct {
int32_t dimSize;
int32_t Numeric[1];
} TD18;
typedef TD18 **TD18Hdl;
I've got some C#-code (generated by PInvoke-wizard) to call these functions:
[DllImport("vosc04.dll")]
public static extern uint32_t VOSC04_General (uint32_t Command, ref TD18Hdl Messages);
[DllImport("vosc04.dll")]
public static extern uint32_t CheckDiameter(uint32_t Command, ref TD6 Parameter);
[StructLayout(LayoutKind.Sequential,Pack=4)]
public struct TD18
public int32_t dimSize;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=1)]
public int32_t [] Numeric;
[StructLayout(LayoutKind.Sequential,Pack=4)]
public struct TD6
public Double SP_Diameter;
public Double SP_Tolerantie;
public Double PV_Diameter;
The problem now is that when I try to read the Messages-output-parameter, I get wrong values (pointers?). I think that the problem lies in the fact that LabView generated a TD18 AND an TD18Hdl struct.
How can I correct this problem?
Can anyone give me some advise to correct this problem? I'm not an expert in C, only in C#.I think the problematic line is this:
public struct TD18
public int32_t dimSize;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=1)]
public int32_t [] Numeric;
It looks like C# is forcing the array to be of size 1. The thing is, LabVIEW stores arrays as handles which are double pointers to a structure which contains a size element followed by the elements of the array. For your example, int32 arrays are stored in memory as:
handle -> location -> |size|element 1|element 2| .... |element size-1|
Because C does not do runtime array bounds checking, you can get away by declaring the structure as:
typedef struct {
int32_t dimSize;
int32_t Numeric[1];
} TD18;
The correct declaration would've been:
typedef struct {
int32_t dimSize;
int32_t Numeric[size];
} TD18;
But size is not a constant, so C/C++ won't let you do that. So, even though the array is declared to be of size 1, it can (and usually does) have more than 1 element. This does not cause a problem because LabVIEW allocates memory based on the actual size of the array.
If I were you, I'd try to change the prototype of the LabVIEW DLL function to accept a pointer to array data, rather than an array handle, pre-allocate memory for the array in C# and pass a pointer to the allocated memory into LabVIEW so that LabVIEW can "fill it up".
Let me know if you need more information.
Pramod -
Is it possible to call a function with the same name from 2 different dll's at the same time.
I'm trying to call a function ( F ) form 2 different libraries ( A.dll and B.dll ) at the same time. The first lib loaded determines the function F. A->F and B->F have same interface and name but different implementation.
Hi,
I tried it with two dll's, both with the same interface, and at the same
time, in the same VI. The popups even appear at the same time.
But now I understand the problem... Both dll's are created by LabVIEW! If
they are not (or one is not, and the other is), this is no problem.
And VI's in memory cannot have the same name. LabVIEW doesn't care if VI's
are in a dll or not.
This might not help, but if you want to make some sort of "plug in" system,
you might consider using llb's. By loading VI's dynamically, you can select
the path from which they are loaded. You must unload (close all references)
one before the loading the other, or the same problem will occur. If you go
this way, I consider a different approach. Make on
e library (or even a dll)
that has the interface you like, this is the "loader". Now make several
"plug in"'s, with the same interfaces. The name of each function in a plug
in is a concatenation of the library name and the function name. The loader
has one extra function, that loads (and unloads, when done) references to
all desired libraries to use (the names of the functions can be figured out
easily). All that the loader functions do is dynamically call the library
functions. You can use a call by reference node for this (you can use the
connector pane or the loader vi, since the interface must be the same!).
If you go this way, I guess the loader library can be converted to a dll...
Hope this helps.
Wiebe.
"rsam" wrote in message
news:[email protected]..
> Thx Wiebe,
>
> did you load both dll at the same time? For example in 1 vi. Somehow
> the first loaded function keeps to overrule the second. Notice that
> the interface is
exactly the same.
>
> I loaded 2 dll created in Labview with results described above.
>
> Regards Ruud -
Error 1097 after calling dll function which allocates memory inside
Hello!
When a call one my functions in my dll from LabView, i get an error 1097. My function takes a few arguments and then allocates some memory for measurement.
It's not returning any pointers to that memory area, it is just allocates that memory for itself. I don't know what could be the problem, probably i am missing something.
Could you help please?
Best regards,
Tamas
Solved!
Go to Solution.Are you sure that the allocate function is the problem?
Error 1097 simply means something inside the external code wrote into memory locations that it was not meant to write. That is usually because of output buffer parameters that are not allocated (large enough) in LabVIEW when passed to the external code fucntion, so the function assuming it received a buffer of a certain size happily writes into that buffer but overwriting other information it should not have.
But that is by far not the only possibility to cause this error. A simple bug in the external code can cause the same problem when a pointer goes astray or such. The fact that you used that library elsewhere already without seeing any problem is unfortunately no guarantee that the function is not buggy. The LabVIEW exeception handling around the Call Library Node has gotten rather picky and can detect violations that do not have to cause visible problems at all. But the violations it detects are real violations so just silencing them is not a good idea, as they could cause all kinds of problems including overwriting vital data structures in your program that either cause a crash later on or simply wrong results in other parts of your program. Especially the last one is a total bummer to debug.
Without seeing much more of your code it is basically impossible to point out where the problem could lie. The particular Allocate function doesn't look like there is much that could be done wrong, but I would assume that you call several other functions too somewhere, which could cause the problem. If you can absolutely positively say that you never ever call any library function with a to short (or unallocated) buffer parameter, then you will have to take it up with the manufacturer of your lib, as it would seem very likely that there is some problem in there.
Also you pass a handle to the library function but your Allocate function does not have this as a parameter! Where does this handle come from? Are you sure you have allocated and prepared it properly before calling this function? A handle is quite often a pointer, although usually a so called opaque pointer meaning the user of the library does not and should not know anything about the structure this pointer points to. It is only known internal to the library.
Rolf Kalbermatter
CIT Engineering Netherlands
a division of Test & Measurement Solutions -
Dot source/calling a function with switch from the cmd line
Hi
This is driving me crazy and I know its something really obvious.
If I have an example script like so, called myexample.ps1
[CmdletBinding()]
param
[Parameter(Mandatory=$false, HelpMessage="My Switch")]
[switch] $Myswitch,
[Parameter(Mandatory=$false, HelpMessage="Email Address")]
[string] $email
Function Main
[CmdletBinding()]
param
[switch] $Myswitch,
[string] $email
if ($Myswitch)
Write-Host "Switch Enabled"
Write-Host "Email is $email"
else
Write-Host "Switch Disabled"
Write-Host "Email is $email"
Main -email $email #This is the line that I think is at fault
I have two issues
1) How do I correctly write the code so that the script can be called with either or both parameters. The switch ($Myswitch) is the one that is really causing me issues.
2) Is invoking it the easiest method/best/most common method of calling it via a batch file
Here's my understanding
a) I could dot source it (. .\myexample.ps1) to load the functions into the current session, then call the function
Main -email hello.com -Myswitch
or
Main -email hello.com
b) or I could Invoke it, which I think is my preference as my final goal here is for it to be called via a batch file in a scheduled task
& 'C:\Users\myusername\Desktop\MyExample.ps1' -email hello -myswitch
or
& 'C:\Users\myusername\Desktop\MyExample.ps1' -email hello
Any push in the right direction will be appreciated :)Why the function? Just call the file. We don't "Invoke" scripts. Just call the script..
# MyExample.ps1
[CmdletBinding()]
param(
[Parameter(Mandatory=$false, HelpMessage="My Switch")]
[switch] $Myswitch,
[Parameter(Mandatory=$false, HelpMessage="Email Address")]
[string] $email
if ($Myswitch){
Write-Host "Switch Enabled"
Write-Host "Email is $email"
}else{
Write-Host "Switch Disabled"
Write-Host "Email is $email"
Now jsut call it like a normal script:
.\MyExample.ps1 -email someemail -MySwitch
It is as simple as that.
If it has to be a function as in a library then you must either dot source or create a module.
¯\_(ツ)_/¯ -
How to call a function with parameters in ScriptStart function
i am trying to call ScriptStart function from SUD dialog. This is how iam calling Call ScriptStart(path & "test.vbs","abc") abc is function which is written test.vbs. It is working. But when i want to pass some parameters to the abc function of test.vbs. It is not working why. can anybody suggest where i went wrong. I am calling the same function as Call ScriptStart(path & "test.vbs","abc(" & text1.Text & ")"). It is not working why ? Is the ScriptStart function only point to functions. it does not take any parameters or waht ?
Hi abc421,
Another option in addition to UserCommands would be to use ScriptInclude(path). If you execute a ScriptInclude(path) command at the beginning of your VBScript, then all the functions and Subs in the VBscript located at "path" are now available to you-- including passing parameters and receiving return values from functions. If you are calling a VBscript that uses only VBScript variables, then this is the preferred method.
If instead you are calling a VBScript that uses global DIAdem variables declared in a VAS file (their variable names all end with the "_" character), then those parameters are already available at the subroutine called with ScriptStart(path, routine).
Brad Turpin
DIAdem Product Support Engineer
National Instruments
Maybe you are looking for
-
I can't seem to open (view) my photos. I get an error message that says "the file couldn't be opened because you don't have permission to view it. To view or change permission, select the item in the finder and choose File. Get info." I have never
-
Need to run 1.4.2 and 1.5.6
Currently we have two NMS applications that require to deferent versions of Java 1.4.2 and 1.5.6. We need to be able to run both application on a windows 2000 environment. We are using IE 6.0. Any suggestions. Thanks Bill
-
Time Machine: Mavericks backup date and time issues
Time Machine: Troubleshooting backup issues re: http://support.apple.com/kb/HT3275 "Messages you may see after clicking the red "i" include:" I am getting a message not listed at this page. My Time Machine fails to backup to my USB3 Passport Externa
-
Remote enabled BAPI/RFC to upload a Resume
Is there any Remote enabled BAPI/RFC to upload a Resume and how to assign it to Applicant ? I need to upload Resume from a .Net program and assign it as attachment or otherwise to Applicant.
-
Does Acrobat not come with Creative Cloud?
I recently purchased the complete Creative Cloud, and I suppose this is my fault, but I assumed that ALL Adobe products came with it. I guess Acrobat is an additional cost? Could someone explain why?