LabWindows/CVI调用DLL实用例程

[复制链接]
6538|8
 楼主| hotpower 发表于 2008-5-27 23:30 | 显示全部楼层 |阅读模式
/*-------------------------------------------------------------------------------------------------------*/&nbsp;&nbsp;&nbsp;&nbsp;<br />/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LabWindows/CVI调用DLL实用例程(菜农HotPower)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;&nbsp;本例程是在CVI自带的simple添加调用mydll.dll的函数MyDLLCdeclFunction()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;&nbsp;网上和CVI的例程很少,一般为调用LIB实例,但很多dll都是以*.dll提供的,故本例程很实用。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;&nbsp;本例程主要是调用了三个Windows&nbsp;API函数LoadLibrary(),GetProcAddress(),FreeLibrary()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*&nbsp;&nbsp;菜农HotPower@126.com&nbsp;&nbsp;2008.5.27&nbsp;&nbsp;于西安大雁塔菜地&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />/*-------------------------------------------------------------------------------------------------------*/&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />/*&nbsp;This&nbsp;is&nbsp;a&nbsp;simple&nbsp;project&nbsp;that&nbsp;will&nbsp;call<br />&nbsp;*&nbsp;functions&nbsp;from&nbsp;an&nbsp;external&nbsp;DLL&nbsp;*/<br />//#define&nbsp;&nbsp;__cplusplus&nbsp;<br /><br />#include&nbsp;&ltstdio.h&gt&nbsp;<br />#include&nbsp;&ltwindows.h&gt//需要的API函数实际在winbase.h中定义<br /><br />#include&nbsp;&ltcvirte.h&gt&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Needed&nbsp;if&nbsp;linking&nbsp;in&nbsp;external&nbsp;compiler;&nbsp;harmless&nbsp;otherwise&nbsp;*/<br />#include&nbsp;&ltformatio.h&gt<br />#include&nbsp;&ltuserint.h&gt<br />#include&nbsp;&quot;mydll.h&quot;<br /><br />/*-------------------------------------------------------------------------------------------------------*/&nbsp;&nbsp;&nbsp;&nbsp;<br />typedef&nbsp;long&nbsp;int&nbsp;DLLEXPORT&nbsp;(*DLLCdeclFunction)(char&nbsp;*);//定义函数指针&nbsp;<br />/*-------------------------------------------------------------------------------------------------------*/&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />int&nbsp;status;<br />char&nbsp;message[80];<br /><br />int&nbsp;main&nbsp;(int&nbsp;argc,&nbsp;char&nbsp;*argv[])<br />{<br />/*-------------------------------------------------------------------------------------------------------*/&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;HMODULE&nbsp;hinstLib;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DLLCdeclFunction&nbsp;DLLFunction;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;fFreeResult,&nbsp;fRunTimeLinkSuccess&nbsp;=&nbsp;FALSE;&nbsp;<br />/*-------------------------------------------------------------------------------------------------------*/&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(InitCVIRTE&nbsp;(0,&nbsp;argv,&nbsp;0)&nbsp;==&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Needed&nbsp;if&nbsp;linking&nbsp;in&nbsp;external&nbsp;compiler;&nbsp;harmless&nbsp;otherwise&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;out&nbsp;of&nbsp;memory&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Tell&nbsp;the&nbsp;dll&nbsp;to&nbsp;run&nbsp;it's&nbsp;user&nbsp;interface&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;RunDllUI();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />/*-------------------------------------------------------------------------------------------------------*/&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//&nbsp;Get&nbsp;a&nbsp;handle&nbsp;to&nbsp;the&nbsp;DLL&nbsp;module.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;hinstLib&nbsp;=&nbsp;LoadLibrary(&quot;mydll.dll&quot;);//装载动态链接库mydll.dll&nbsp;<br />&nbsp;&nbsp;&nbsp;//&nbsp;If&nbsp;the&nbsp;handle&nbsp;is&nbsp;valid,&nbsp;try&nbsp;to&nbsp;get&nbsp;the&nbsp;function&nbsp;address.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hinstLib&nbsp;!=&nbsp;NULL)//成功装载动态链接库mydll.dll&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DLLFunction&nbsp;=&nbsp;(DLLCdeclFunction)GetProcAddress(hinstLib,&nbsp;(LPCSTR)&quot;MyDLLCdeclFunction&quot;);//取函数指针地址&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;If&nbsp;the&nbsp;function&nbsp;address&nbsp;is&nbsp;valid,&nbsp;call&nbsp;the&nbsp;function.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(fRunTimeLinkSuccess&nbsp;=&nbsp;(DLLFunction&nbsp;!=&nbsp;NULL))//dll中有函数MyDLLCdeclFunction()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fmt(message,&nbsp;&quot;message&nbsp;via&nbsp;DLL&nbsp;function\n&quot;);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;(long&nbsp;int)DLLFunction&nbsp;(message);//调用dll函数!!!&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Free&nbsp;the&nbsp;DLL&nbsp;module&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fFreeResult&nbsp;=&nbsp;FreeLibrary(hinstLib);//卸载动态链接库mydll.dll&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;If&nbsp;unable&nbsp;to&nbsp;call&nbsp;the&nbsp;DLL&nbsp;function,&nbsp;use&nbsp;an&nbsp;alternative&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!&nbsp;fRunTimeLinkSuccess)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fmt(message,&nbsp;&quot;message&nbsp;via&nbsp;alternative&nbsp;method\n&quot;);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessagePopup&nbsp;(&quot;CVI&nbsp;MessagePopup&nbsp;&quot;,&nbsp;message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />/*-------------------------------------------------------------------------------------------------------*/&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Call&nbsp;the&nbsp;Stdcall&nbsp;Style&nbsp;DLL&nbsp;Function&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;MyDLLStdcallFunction(&quot;Text&nbsp;buffer&nbsp;1&nbsp;being&nbsp;passed&nbsp;from&nbsp;CVI&nbsp;to&nbsp;DLL&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Display&nbsp;returned&nbsp;value&nbsp;from&nbsp;DLL&nbsp;function&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;Fmt(message,&nbsp;&quot;MyDLLStdcallFunction&nbsp;status&nbsp;returned:&nbsp;%i&quot;,&nbsp;status);<br />&nbsp;&nbsp;&nbsp;&nbsp;MessagePopup&nbsp;(&quot;CVI&nbsp;MessagePopup&nbsp;&quot;,&nbsp;message);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Call&nbsp;the&nbsp;Cdecl&nbsp;Style&nbsp;DLL&nbsp;Function&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;MyDLLCdeclFunction(&quot;Text&nbsp;buffer&nbsp;2&nbsp;being&nbsp;passed&nbsp;from&nbsp;CVI&nbsp;to&nbsp;DLL&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Display&nbsp;returned&nbsp;value&nbsp;from&nbsp;DLL&nbsp;function&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;Fmt(message,&nbsp;&quot;MyDLLCdeclFunction&nbsp;status&nbsp;returned:&nbsp;%i&quot;,&nbsp;status);<br />&nbsp;&nbsp;&nbsp;&nbsp;MessagePopup&nbsp;(&quot;CVI&nbsp;MessagePopup&nbsp;&quot;,&nbsp;message);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br /><br /> 相关链接:<a href='http://space.**/Upload/Blog/2008/5/27/3dd1bb60-01d3-48d6-9967-ecece1a2a758.rar'>http://space.**/Upload/Blog/2008/5/27/3dd1bb60-01d3-48d6-9967-ecece1a2a758.rar</a>
McuPlayer 发表于 2008-5-27 23:52 | 显示全部楼层

DLL有显式调用和隐式调用

LoadLibray+GetAddress方式属于显式,其好处是不需要lib和h文件,并可实现动态加载<br /><br />链接Lib文件是隐式调用,好处是像调用本地函数一样使用DLL内的函数,缺点是在exe启动的时候逐一加载。
 楼主| hotpower 发表于 2008-5-28 00:01 | 显示全部楼层

lib的CVI例程太多,dll例程很少...俺也想在此求助问题

CVI能否调用VC的C++的dll???<br /><br />类的成员如何调用???<br /><br />在此求助如何用CVI调用RTDXINT.DLL???
high 发表于 2008-5-28 14:15 | 显示全部楼层

McuPlayer,原来如此啊。

我一直纳闷着。<br />那么这个lib和静态的lib也应该是不一样的。它可能只是个interface.
 楼主| hotpower 发表于 2008-5-28 20:54 | 显示全部楼层

lib没难度,dll就不同了~~~

  
xzhenggen 发表于 2008-5-30 13:13 | 显示全部楼层

呵呵,用CVI调用DLL,真是浪费时间。

  
McuPlayer 发表于 2008-5-30 18:49 | 显示全部楼层

关于DLL的interface问题

所有Windows&nbsp;API几乎全是DLL实现,用的是stdcall调用,他约定了参数的操作顺序以及谁负责平衡堆栈。<br /><br />C或者C++默认的是cdecl调用,所以stdcall的前缀是必须的(可以用宏替换)。<br /><br />CVI没有用过,但两个程序如果要用C++的Class做Interface,双方一定要用同一个class的定义文件,然后被调用方生成此Class的实例,并传递给调用方--比如CVI模。<br /><br />于是问题来了,DLL升级,比如增加一个成员函数,h文件变化了,调用者CVI也必须升级。怎么办?虚函数,抽象类。大家共用的一个class是抽象的,纯粹为了接口,真的实现都是这个class的继承类。<br /><br />然后问题又来了,每个DLL都要有这个h文件给调用者,文本文件很容易误修改也容易导致和被调用者的h有差异,比如Office有贼多的DLL,可以想想得有多少个h文件做Interface啊,M$也觉得maintain这么多的h文件挺累人,于是OLE出来了,COM出来了。
 楼主| hotpower 发表于 2008-6-1 20:24 | 显示全部楼层

哈哈~~~COM的真谛快要搞到了...

  
 楼主| hotpower 发表于 2008-6-6 02:37 | 显示全部楼层

哈哈~~~COM菜鸟是毕业了,但dll里的程序只能写不能读很郁闷~~~

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

本版积分规则

1460

主题

21617

帖子

508

粉丝
快速回复 在线客服 返回列表 返回顶部