调用dll出现的一个问题,问题解决汗。。

     想把自己最近写的代码做成dll文件,代码使用了mfc中的类型,所以直接创建mfc规则dll,mfc规则dll分为静态链接库lib和动态链接库dll,我选择后者,创建工程后,写好代码,查看cpp文件,到网上查找了有关代码,依据网上所说,在mfc动态dll中定义函数函数,格式为形如  extern "C"  类型 PASCAL EXPORT fun(参数1,参数2,....),这样写也可以,但是我还是比较熟悉非mfc dll 的编写,觉得那样方便,我还是沿用非mfc dll的老路子,我定义的函数形式如:

#ifndef FULLSCREEN_DLL
#define FULLSCREEN_DLL  __declspec(dllexport)
#else
#define FULLSCREEN_DLL  __declspec(dllimport)
#endif

extern "C" FULLSCREEN_DLL  fun( 参数1,参数2,....)

     定义完导出后,在def文件中定义了导出函数的名字,生成dll文件。将生成的dll、lib和头文件复制到要调用dll文件的应用程序的工程目录下,这里的调用方式,我两种都试过。显式调用和隐式调用,先说说显式调用,我是打算在一个窗口程序中的OnInitDialog()函数中调用dll文件中的函数,调用过程如下:

  HINSTANCE ylhinstance;
 ylhinstance=::LoadLibrary(_T("FullScreenDllNew.dll"));
 if(ylhinstance==NULL)
 {
  MessageBox(_T("lib加载错误!"));
  return 0;
 }
 function proc=(function)GetProcAddress(ylhinstance,"WindowsSizeDeal");
 if(proc==NULL)
 {
  MessageBox(_T("lib加载成功,函数获取失败!"));
  return 0;
 }
   
 proc(m_hWnd,maxwindowrect,normalwindowrect,1);
 FreeLibrary(ylhinstance);

     其中的funtion为函数指针,其定义如下typedef void (*function)(const HWND goalwindow,CRect &goalwindowrect,CRect &smallestWindow,int caseflag);这种调用其实只需要dll文件就够了。

     隐式调用,这种调用需要dll、lib和头文件(以本文中的情况为参考),将dll文件复制到应用程序的debug文件夹中,将lib和头文件赋值到工程目录下,在要调用dll文件的对话框的cpp文件中,只要包含h头文件使用#paragm comment(lib,“目标.lib"),即可实现对预定dll的调用,不过这个也有一些特殊情况,假如这些h头文件和lib文件不再工程目录下呢,#paragm comment(lib,“目标.lib")中的路径就要注意一些了,比如,将h头文件和lib文件一起放入工程目录下的A文件夹,现在工程文件目录下的B文件夹中的B.cpp要调用A

中的lib文件,我在这里犯下了一个严重的错误!我的调用方式如下:

#include ".\A\A.h"//A,h为dll文件的头文件

#pragam comment(lib,",\\A\\A.lib")//A.lib为dll文件的lib文件

上述语句是在B.cpp中调用的,当我运行程序一直提示我说.\A\A.lib文件打不开,我一直都以为是dll、lib文件损坏了的原因,后来才知道,头文件的定义和lib文件的加载的默认的文件路径是不同的,当我们在定义头文件时,默认的工作路径为本文件在工程目录中的路径,比如在B.cpp中定义头文件,其默认的工作路径为”工程目录/B文件夹/,如果在工程目录下的C文件中cpp文件中包含头文件,则默认工作路径为“工程目录/C/”,这点我是明白的,犯错误的是后面这个!#pragam comment()加载lib文件的默认工作路径并不是“工程目录/B/”而是“工程目录/”,也就是说,在工程目录下所有文件中使用此方式调用dll其默认的工作目录都是“工程目录/”,我的错误终于找到了,将“..\\A\\A.lib”改成".A\A.lib",编译程序,不报错,正常运行.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值