GorionQuest Posted March 22, 2008 Report Share Posted March 22, 2008 Hi all, I searched high and low in NI's website for solutions for calling a DLL which returns a struct (the DLL is for third party SMU cards). I wonder if it is alright to ask here for some guidelines. I have never used C before and has relied on NI LabVIEW and NI's cards for most of the work done. Appreciate the help. Here is the a snippet of the header file for the DLL. As shown below the struct contains a float,float and short typedef struct SMUmeasurement { float Voltage; float Current; short MeasurementStatus; } SMUmeasurement; and here is the function that returns the struct value: SMUmeasurement WINAPI MeasureAvrgVandI_SMU_DM200(short DeviceID, short SampleCount); When I used the LabVIEW 8.5 dll import wizard, I found out that it only returns a unsigned integer instead of a nice cluster. Please see attached image. Thanks for the guidance, Regards, Philip Quote Link to comment
Rolf Kalbermatter Posted March 22, 2008 Report Share Posted March 22, 2008 QUOTE (GorionQuest @ Mar 21 2008, 12:02 AM) Hi all,I searched high and low in NI's website for solutions for calling a DLL which returns a struct (the DLL is for third party SMU cards). I wonder if it is alright to ask here for some guidelines. I have never used C before and has relied on NI LabVIEW and NI's cards for most of the work done. Appreciate the help. Here is the a snippet of the header file for the DLL. As shown below the struct contains a float,float and short typedef struct SMUmeasurement { float Voltage; float Current; short MeasurementStatus; } SMUmeasurement; and here is the function that returns the struct value: SMUmeasurement WINAPI MeasureAvrgVandI_SMU_DM200(short DeviceID, short SampleCount); When I used the LabVIEW 8.5 dll import wizard, I found out that it only returns a unsigned integer instead of a nice cluster. Please see attached image. Thanks for the guidance, Regards, Philip The only way to deal with that in LabVIEW besides writing a wrapper DLL, is to treat it as a uInt32 as far as the Call Library Node is concerned. Then using the MoveBlock() internal call in LabVIEW (search for that name here or on the NI forums) or some other OS API memory copy function, copying the contents from the uInt32 which is now treated as the pointer into a LabVIEW Cluster of compatible layout. Rolf Kalbermatter Quote Link to comment
GorionQuest Posted March 22, 2008 Author Report Share Posted March 22, 2008 QUOTE (rolfk @ Mar 21 2008, 06:57 PM) The only way to deal with that in LabVIEW besides writing a wrapper DLL, is to treat it as a uInt32 as far as the Call Library Node is concerned. Then using the MoveBlock() internal call in LabVIEW (search for that name here or on the NI forums) or some other OS API memory copy function, copying the contents from the uInt32 which is now treated as the pointer into a LabVIEW Cluster of compatible layout.Rolf Kalbermatter Hi rolfk, Thanks for the answer, I was tempted to write a wrapper for the DLL since it was recommended in most NI forums but I do not have the source code for the dll in C/C++. But I will try the MoveBlock() if it could solve this problem. Thanks for the guidance! I have been using LabVIEW too extensively, guess I need to learn C programming to make full use of the external code call to maximise LabVIEW. Again thanks for the information. Philip Quote Link to comment
GorionQuest Posted March 24, 2008 Author Report Share Posted March 24, 2008 Hi guys, Basically here is my code after the advice. Please let me know if you think I have done it wrong. Much appreciate the advice. I have not tested it on the hardware as I need it to be hooked up properly to test it. I used the MoveBlock() code from LabVIEW to get the data from the pointer passed by the uint32 into the first parameter of the MoveBlock() and wired a cluster constant with 2 SGL and one I16 to reflect the struct which is float, float and short. The size of the struct should be 12 bytes. Thanks for any feedback. Philip Quote Link to comment
Rolf Kalbermatter Posted March 25, 2008 Report Share Posted March 25, 2008 QUOTE (GorionQuest @ Mar 23 2008, 06:11 AM) and wired a cluster constant with 2 SGL and one I16 to reflect the struct which is float, float and short. The size of the struct should be 12 bytes. Thanks for any feedback. Make that 10 bytes: float: 4 byte, float: 4 byte, short: 2 byte, together: 10 bytes. Otherwise you are corrupting memory during the MoveBlock call. Rolf Kalbermatter Quote Link to comment
GorionQuest Posted March 25, 2008 Author Report Share Posted March 25, 2008 QUOTE (rolfk @ Mar 24 2008, 09:57 PM) Make that 10 bytes: float: 4 byte, float: 4 byte, short: 2 byte, together: 10 bytes. Otherwise you are corrupting memory during the MoveBlock call.Rolf Kalbermatter Many thanks for the correction. Please let me know if you happen to be in Penang, Malaysia. I would be happy to give you a tour. Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.