zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1886回复:17

MFC如何调用C的动态链接库?

楼主#
更多 发布于:2004-09-23 16:40
如题,如果能有现成的工程能发给我看看就更好了,先谢过了!!!!
zsh_7769@163.com

Evilly
驱动牛犊
驱动牛犊
  • 注册日期2004-07-09
  • 最后登录2005-04-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-23 16:54
关注,哈哈,看看有没有人回答~~~~~~~~~
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-23 17:14
http://www.driverdevelop.com/forum/html_78454.html?1095930863
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-23 17:15
见如下回复
http://www.driverdevelop.com/forum/html_78454.html?1095930863
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-29 15:46
还是不太明白,哪能找到例子或者哪位兄弟有就给我发一个吧,先谢过了!
jijunjie
驱动牛犊
驱动牛犊
  • 注册日期2004-07-21
  • 最后登录2004-12-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-30 16:37
呵呵
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-10-13 15:44
http://www.driverdevelop.com/forum/html_78454.html?1095930863

编译时出现了错误:LINK : fatal error LNK1104: cannot open file "pci9054loopdll.lib/nologo.obj"
Error executing link.exe.
不知道该如何解决?请多多帮忙!谢谢!
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-10-13 15:45
http://www.driverdevelop.com/forum/html_78454.html?1095930863

编译时出现了错误:LINK : fatal error LNK1104: cannot open file "pci9054loopdll.lib/nologo.obj"
Error executing link.exe.

pci9054loopdll.lib是自己加进去的,
不知道该如何解决?请多多帮忙!谢谢!
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-10-13 16:04
这个不需要 .lib 文件,使用动态装载

           HINSTANCE m_hLib;//库句柄

          CString strLibPath = "youlib.DLL";

          m_hLib = AfxLoadLibrary( strLibPath  );
          strLibPath.Empty();

          if (!m_hLib)
          {
              return;//加载库装载失败
          }//

          //定义函数指针类型(也可以在头文件中定义,记得只是一个类型)
          typedef BOOL (_cdect *GETVALUE)(int x, int y);

          使用库函数
          GETVALUE getValue;
          getValue = (GETVALUE)GetProcAddress(m_hLib, "GetValue" );

          int ret = 0;

          if (NULL != getValue)
          (
              ret = getValue( 100, 50 );
              getValue = NULL;
          }//end if
          
          //使用 ret

          //释放库
          AfxFreeLibrary( m_hLib );

当然在也可以用去掉 Afx 的API
          
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-10-13 16:13
xx_focus,我对c++不是很懂,我的动态链接库是用纯c做的,这样调用可以吗?
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-10-13 16:17
先试试看,我想可以,MS 很多库好像也是纯 C 写的
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-10-13 16:23
把那段代码加在哪呢?"youlib.DLL"是不是我自己的pci9054loopdll.dll?
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-10-13 16:34
是的,可以在任何你要使用你的库函数的地方
库加载、释放可以在程序或模块开始、结束是进行,当然也可在执行时使用,这要看你的库和库函数使用是否频繁,好像局部变量和全局变量一样加载后的库句柄也是一个变量,使用库中任何一个函数都离不开它。
不过要注意的是函数在每次使用前做好使用 GetProcAddress 重新获取函数指针
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-10-13 16:45
没办法,对c++不怎么会,还是不怎么会用。下面是有一个网友教我的方法,第二种方法跟你说的估计差不多,但我只能选第一中方法,真不知道该怎么解决才好?

一种方法把.h文件和.lib文件,加入你自己的工程。
之后,如同调用本地全局函数,即可。

另一种方法是使用LoadLibrary和GetProcAddress,前者获得连接库句柄,后者可以获得函数指针,这样的调用更加灵活。
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-10-13 17:07
在MFC中通常 LoadLibrary 和 AfxLoadLibrary 可以一样的使用,
不要因为函数名字而直接区分它们,虽然它们还是有区别的,如果继续接触 MFC 应该还会开到 LoadLibraryEx 和 AfxLoadLibraryEx,呵呵。我通常使用这种方式加载动态连接库,只在需要的时候把这些库加载到内存中去。而你说的第一种方式在程序一开始就加载了,直到结束关闭,当然系统来不及处理时还会被当作内存碎片留在那里。况且,第一种方法在程序默认状态下加载库时可能还不能作驱动加载之类的事情,第二种方式就好解决的多。

我说的不是完全有道理,只是想建议你使用 LoadLibrary 方式
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-10-13 17:14
呵呵,多谢多谢!主要是比较急,所以使用 LoadLibrary 方式的话可能会来不及,你那边有现成的工程能发给我看看吗?先谢过了!
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-10-13 17:24
不好意思,我没有小程序,不过随便自己做个测试程序也用不了半个小时,验证一下加载是否成功是很简单的
建一个MFC工程,然后把我的这段代码加上,把你的库考到你的目标应用程序目录中(当然直接指定路径也是可以的,如:"C:\\mytestlib\\mylib.dll")),接着运行你的程序,中间加个判断就可了,如:
if (!m_hLib)
{
    AfxMessageBox("加载库失败!");
}
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-10-13 17:32
多谢楼上的兄弟!以后有这方面的问题直接问你方便吗?能不能直接发到你的邮箱?
游客

返回顶部