找回密码
 注册
Simdroid-非首页
查看: 880|回复: 14

【注意】调用DLL新疑问?+9.1

[复制链接]
发表于 2003-11-20 01:45:48 | 显示全部楼层 |阅读模式 来自 江苏南京
我又把HELP文件看了一遍,感觉有点长进,生成了DLL文件,configuration也设置了,可是程序还是断的,我在前面板中给各个输入参数赋了值,函数的输出也有indicator,我点那个断的箭头,它提示说:function not founed in library,然后我继续查资料,资料上 有个标题引起了我的注意Preventing C++ Name Decoration,,就是说用VC编译的时候,可能编译器会把函数的名字改动,从而在目标DLL文件中,可能函数名遍了,关键就是在这里,我不是很懂了,资料上,是这样实现的,
  
When you build shared libraries for C++, you must prevent the C++
compiler from decorating the function names in the final object code. To
do this, wrap the function declaration in an extern "C" clause, as shown
in the following prototype.
  
extern "C" {
      long MyDLLFunction(long nInput, unsigned long nOutput,
      void *arg1);
}
     long MyDLLFunction(long nInput, unsigned long nOutput,
     void *arg1)
{
/* Insert Code Here */
  
我不是很懂它的这个“C“是什么意思,我就直接在我的函数前面加了一个extern
  
可是结果还是不行,我现在想,可能就是这块的问题,所以来问问,请高手给点指点,谢谢:)
 楼主| 发表于 2003-11-21 21:52:23 | 显示全部楼层 来自 江苏南京

回复: 【注意】调用DLL新疑问?

Simdroid开发平台
这里的人怎么这么不热情啊,其实我觉得对于用过DLL的人来说,我问的问题,可能很简单,可是如果您稍微指点一下,我就能把一直困饶我的问题解决了,哎,哎,哎!得不到积分,又看不到FTP里面的内容,自己的知识长进比较慢,为什么我们的斑竹门,就不多多为新手考虑考虑呢??
  
难道你们就不是从新手过来的吗?
发表于 2003-11-21 22:15:01 | 显示全部楼层 来自 上海嘉定区

回复: 回复: 【注意】调用DLL新疑问?

jiangkai0812 wrote:
这里的人怎么这么不热情啊,其实我觉得对于用过DLL的人来说,我问的问题,可能很简单,可是如果您稍微指点一下,我就能把一直困饶我的问题解决了,哎,哎,哎!得不到积分,又看不到FTP里面的内容,自己的知识长进比较慢,为什么我们的斑竹门,就不多多为新手考虑考虑呢??
  
难道你们就不是从新手过来的吗?

  
看了你这段话,我看了看你的提问,觉得不能找出你真正的错误所在,还是不能回答你的问题。
  
还有,这里不是手把手教你的老师,万事主要靠自己。
发表于 2003-11-22 14:39:09 | 显示全部楼层 来自 浙江杭州

回复: 【注意】调用DLL新疑问?

这位先生
你不要只是说,把例子发出来
包括C的源程序
和DLL,这样大家能帮你了,不要先这么大火气,大家都很忙
不一定马上就有答案的,何况来的人不一定都用DLL的
发表于 2003-11-22 21:41:06 | 显示全部楼层 来自 辽宁沈阳

回复: 【注意】调用DLL新疑问?

有时一个空格就可能导致整个程序的运行错误
发表于 2003-11-22 22:26:28 | 显示全部楼层 来自 陕西西安

回复: 【注意】调用DLL新疑问?

不要着急,请将你的整个CPP贴上来即可。
powermaxrc 该用户已被删除
发表于 2004-5-30 00:06:50 | 显示全部楼层 来自 湖南长沙
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2004-5-30 00:38:42 | 显示全部楼层 来自 天津

回复: 【注意】调用DLL新疑问?

关键是要了解被调用的函数名称、功能以及输入输出函数的个数及类型。值得一提的是,在调用CLF节点的时候,如果库函数的输入输出参数中有数组,那么输入的数组一定要根据数组的大小预先初始化,也就是给该数组开辟内存,否则调用不会成功。
除了要明白库函数的入口参数和返回参数的数量和类型外,还要对节点进行配置才能使用。双击CLF节点打开CLF节点配置对话框,点击“Browse…”按钮,打开文件对话框,找到存储在硬盘上的DLL函数(或API函数),也可在这里直接输入路径和函数名称,找到库函数后,函数名称就自动的列在Function Name的下拉列表里,只要选上就可以了,这里就只有一个PortOpt函数名称。如果是WINAPI函数,在Calling Conventions中选择“stdcall(WINAPI)”,如果是用Visual C++语言编译的库函数就选择“C”。 Parameter框中的return type是指库函数的返回数据类型,这里不变;Type框中选择“numeric”, Data Type框选择“Signed 32-bit Integer”。这样,库函数的返回参数就设置好了,类似的方法设置好其他参数,点击“OK”退出对话框。这样,CLF节点就可以调用库函数完成任务了。
  
解答得很详细,由于LabVIEW的版本众多,所以提倡给出框图图片的解决问题的方式。同时尽可能将调试好的程序附上。 by keiran

本帖子中包含更多资源

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

×

评分

1

查看全部评分

发表于 2004-5-30 12:24:37 | 显示全部楼层 来自 江苏南京大学

回复: 【注意】调用DLL新疑问?

extern "C"表示要求编译器按照C而不是C++方式编译.
比如,一个函数 void func(a);
按照c方式最终在dll 中函数名:func
按照c++方式最终在dll 中函数名:func@977 (后缀不一定)
这样调用时还需要用dumpbin得到最终的函数名,比较麻烦.
所以在函数声明前加extern "C"

评分

1

查看全部评分

发表于 2004-5-31 02:51:20 | 显示全部楼层 来自 天津

回复: 【注意】调用DLL新疑问?

由于dll涉及到保密问题,这里不便提供,我只是把dll函数中函数的定义给出:
extern "C" __declspec(dllexport) int PortOpt(U32 u32Command,U32 *u32DataNumber,S16 s16Data[])
  
附件是调用的源程序。

本帖子中包含更多资源

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

×
x8051 该用户已被删除
发表于 2004-6-11 09:44:37 | 显示全部楼层 来自 台湾
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2004-6-16 15:34:17 | 显示全部楼层 来自 江苏无锡

回复: 【注意】调用DLL新疑问?+9.1

mebusw说的非常对,我看问题应该出在dll 的编程上,函数名给变了,有两个办法:1、加extern "C";2、用.def 文件直接定义函数输出名。
nanlinfeng 该用户已被删除
发表于 2004-7-7 23:41:57 | 显示全部楼层 来自 江苏南京
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2004-7-8 10:27:11 | 显示全部楼层 来自 天津

回复: 【注意】调用DLL新疑问?+9.1

对于已有的dll参考说明书
发表于 2004-7-8 14:12:59 | 显示全部楼层 来自 清华大学

回复: 【注意】调用DLL新疑问?+9.1

x8051的问题楼上的xht已经提到了,就是“输入的数组一定要根据数组的大小预先初始化,也就是给该数组开辟内存,否则调用不会成功”。你的数组需要赋初值,如下图

本帖子中包含更多资源

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

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-6-15 07:47 , Processed in 0.059614 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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