cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
楼主: xiaolei3232

求助DLL文件调用问题

[复制链接]
 楼主| 发表于 2010-5-19 14:37:40 | 显示全部楼层
回复 15# 飞雨天


    谢谢版主勉励,运行时总是提示ERR1097。我正在试着自己写个DLL去吧结构体的数据分解为一般的数据类型。看看能不能走的通。

    碰到棘手的问题就盼着能有个人讨论一下,所以楼主都帮忙看我就真的很感激了。有没有结果都没有关系!!
发表于 2010-5-19 15:31:59 | 显示全部楼层
err1097是labview的错误还是你的dll输出错误?

我看了mannual和那个clk_lib.h,没有提及calling convention的事情,也没有说cluster的alignment方式,你给厂商一个电话,把这两问清楚。

另外,这些结构都简单,不用wrap的
 楼主| 发表于 2010-5-19 15:47:15 | 显示全部楼层
好的,多谢!!
发表于 2010-5-19 15:50:11 | 显示全部楼层
Data link areas in the Controller Link Support Board are allocated in the
FinsGateway event memory. Refer to the FinsGateway online help for in-
formation on the area types and sizes in event memory.

我需要area types and sizes这个信息
 楼主| 发表于 2010-5-19 16:15:43 | 显示全部楼层
回复 17# 飞雨天


    Labview错误截图如附件。

    因为国内的欧姆龙技术支持也没有原函数,所以对于您所说的问题他们也不清楚。而且从我和欧姆龙技术支持的接触看(打了N个电话)他们对于第三方软件开发的事情基本上帮不上一点忙。

   我在一本参考书上找到了用VC调用函数的例子。附件的C程序就是参考书上调用ClkReadDatalink()的程序,不知道对您是否有用。


PS:我自己的Dll文件已经制作完成,在Labview中也可以调用。输出了结构体的地址指针,但是传递给板卡的DLL也是有1097的错误。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2010-5-19 16:20:13 | 显示全部楼层
本帖最后由 xiaolei3232 于 2010-5-19 16:21 编辑

回复 19# 飞雨天


    area types and sizes的说明如附图。

     类型应该是CIO与DM两个。Offset指的是起始地址,设置为0就可以。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2010-5-19 20:20:27 | 显示全部楼层
本帖最后由 飞雨天 于 2010-5-19 20:22 编辑

你写个wrap好了,clkwritedatalink的第二个参数是一个指针,指向一个结构,结构的第一个元素是指向const char的指针,第二个元素是一个u32。你第一楼的那个11.vi上基本作对了,不过你传递给这个参数的是一个指针,指向一个结构,结构的第一个元素是4个字节,放置的是string本身,而不是要求的char的指针,第二个元素当然没有问题。而且我用ollydbg看了下,函数都是stdcall的,你也改下。

至于wrap的做法,很简单,输入string对应的u8数组,0编码结尾,在wrap里获得数组指针,然后把指针和u32给放到一个struct里,然后返回这个struct的指针,这个指针就是clkwritedatalink需要的。当然,你的struct也需要LabVIEW输入,而不能是你wrap里的局部变量。LabVIEW输入这个struct应该可以把两个u32给bundle在一起,把这个cluster输入,然后选择adatpt to type,这样就是给wrap输入了这个cluster的指针,你直接返回这个指针,wrap做的工作就是往这个指针所指向的区域填入具体的参数值

PS:sample.rar里的那个c是你自己写的么?
 楼主| 发表于 2010-5-19 21:39:02 | 显示全部楼层
回复 22# 飞雨天


    先谢谢斑竹!!

    sample.rar里面的程序是我在一本参考书(书名明天再写,不记得了)里面抄下来的。参考书里用VC调用DLL文件作了一个读写的程序,这个只是其中的一个函数。

    我已经作了一个DLL文件,现在跟您所说的有点不同,明天我按照您所说的重新修改DLL后再试一下。

    PS:我在参考书里的程序(SAMPLW.RAR中的程序)把结构体的第一个成员设置为字符串常量(不知道理解得对不对),这个斑竹说的有点出入,请指导!!
 楼主| 发表于 2010-5-20 11:48:36 | 显示全部楼层
回复 22# 飞雨天


    版主,您好!

    我自己做了个DLL文件,思路就是“输入4个字符的ASCII码(当为CIO时,最后一个输入0;当为DM时后两个都设置为0),组成一个数组并返回数组的地址指针。在lab中调用dll中的wrap函数,将返回值(u32)与一个U32的数值捆绑为簇,然后将簇(adapt to type,按值chuli)传递给CLK函数”。

     wrap.CPP中代码与lab程序框图如图。运行结果是ClkWriteDatalink()返回代码为5的错误,该错误表示内存类型出错。我理解还是传递给ClkWriteDatalink()的参数有问题。

     麻烦版主能不能抽时间给看看,谢谢!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2010-5-20 13:02:05 | 显示全部楼层
嗯,我已经开始我的探索,不过有个小意外,公司全体明天出去玩,我肯定不会错过,所以,明天就没时间了,要到后天下午回来,回来之后我会去网吧,昨天和今天在研究这个dll,希望这周末能搞定。
   还是那话,一起努力,看谁先完成,这样才有意思~加油!
 楼主| 发表于 2010-5-20 14:55:34 | 显示全部楼层
好的,一起加油!!{:5_417:}
 楼主| 发表于 2010-5-20 16:26:40 | 显示全部楼层
回复 25# 飞雨天


        版主,您好!

        我已经搞定,基本思路仍然同24楼。我在DLL中将函数更改为不带参数的函数LPVOID Wrap(),在函数内部定义字符串常量,然后函数返回字符串的地址指针。其他都不变。

        非常感谢您的帮助!我的项目仍然有很多工作,如果有问题再请教!!

         真的很喜欢这个论坛,也非常感谢版主!!
发表于 2010-5-20 19:50:02 | 显示全部楼层

搞定就好,开瓶啤酒庆祝下,其实这个是小问题,对懂的人来说很简单,不懂就复杂了。
然后我刚好就是半瓶醋到处晃悠,一直拖了几天,自己都很不好意思。
本来今天想说,你原先那么做wrap是不可以的,因为dll里定义一个局部变量,然后把变量地址返回,这么做是会有问题的。可你最新的回帖说的基本还是一回事,居然可以,这就让我很郁闷了。
当然,最好的还是去彻底搞清楚dll调用,知其然而知其所以然,如果有很多选择,我们不断尝试,找到一个能用的,就万事大吉,当然也可以,但是如果能知道为什么其它的不可以,会更好一些。
 楼主| 发表于 2010-5-21 08:41:57 | 显示全部楼层
回复 28# 飞雨天 的帖子


    版主谦虚!真谢谢版主一直这么热心,我先把这个比较着急的项目弄完然后潜心学习一下。

    再请教一个问题:如果我的程序拿到其他的电脑上使用,直接拷贝自己制作的DLL就行是吧?不需要DLL之外的其他文件吧?
发表于 2010-5-22 18:14:42 | 显示全部楼层
本帖最后由 飞雨天 于 2010-5-23 15:48 编辑

不需要~~~另外,我自从08年辞职之后脑袋就好似没清醒过,昨天喝啤酒(不是庆祝哦~~)喝到吐,突然想起上面某个问题的答案,这里简短解释下:
      如果你去看某些c的书或者其它一些资料,可能会看到以下说法:子程序(子vi)不要返回局部变量指针,因为局部变量随着子程序结束就可以认为已经消失了(就是栈帧的建立和清除,其实那些局部变量在子程序刚结束的时候是存在的,但不能保证在一个程序运行过程中局部变量会不会被覆盖,令做它用。这种情况是很常见的,因为一个程序的栈就在那块差不多固定的内存中,多调用几次子程序肯定会把前面子程序的局部变量覆盖。而覆盖之后,你去读取是不会有大问题的,之多就是读出来的数据时错的,但如果你去写入,可能你会写一个比较多字节的变量,这样就会把某子程序的栈帧给破坏掉,或者说把返回地址给破坏,这样就会引发很严重的问题)。
然后我很自以为子程序里肯定不能返回任何变量指针的,当时是很模糊这样认为,如果自己把这话写出来,就也可以发现错误。以下是几类子程序(callee)可以返回指针到调用它的子程序(callor)的变量:
1全局变量   2callor的局部变量  3子程序里的静态变量(c里用static声明的那种,const也是可以)
这么一说,就很明白了,你是返回const的字符串指针,当然是可以的。
不过还是不建议这么做,因为如此一来就不能变换区域了,最好的做法是在LabVIEW中传递一个字符串给你的wrap dll,然后dll返回该字符串指针,属第2种情况。
让高手笑话了,以后争取努力学习,努力联想,努力提高~~~

PS:发现错误了,附加修改下,静态变量时static,常量是const,静态变量的引入时为了辅助函数的模块化,是loose couple的一个典型,可以用静态变量的地方都可以用全局变量,不过全局违背了模块化编程的思想。静态变量是放在全局变量区域的,不用通过栈的建立和清除来处理,所以生存周期为程序全周期。故可以返回指针。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-5-5 19:50 , Processed in 1.630536 second(s), 4 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表