2010.11.1 windows下dll的生成、使用、调试

引用:http://www.vsdk.net/vsdk/C/vsdk141643.shtml

 

 


  说来真是惭愧,做了这么久的程序,还没有花费三个小时来攻克某一个技术点。而VC却让我如此尴尬了一回。经过三小时的研究,终于解决了VC中调用Dll以及Dll的调试问题。
  的确,网上相关资料有很多,但照着说明做后,没有一个能够成功运行的,不过对我的帮助还是非常大。
  首先让我们来看看,在VC中如何调用Dll。这里我们仅仅说明程序中如何调用Dll,关于如何创建Dll请参考相关资料。
1、 创建Win32 Dynamic-Link Library工程,命名为MyDll。
2、 在MyDll.h文件如下。
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

class MYDLL_API CMyDll {
public:
 CMyDll(void);
};
MYDLL_API int Max(int a, int b);
extern MYDLL_API int nMyDll;
MYDLL_API int fnMyDll(void);

3、 在MyDll.cpp文件中实现该函数。
MYDLL_API int Max(int a, int b)
{
 if(a>b)
  return a;
 else
  return b;
}
4、 创建MyDll.def文件对Dll函数进行定义。(这一步必须做)
LIBRARY "MyDll"

EXPORTS
    Max
5、 编译后,会在该工程的Debug目录下生成相应该的Dll文件。
6、 新建应用程序(.exe)TestDll,在应用程序中加入如下代码。(该工程的路径就放在MyDll工程目录下,也可以放在其它地方,不过设置的时候要注意路径)
 typedef int  (* LPFNDLLFUNC)(int ,int);
 LPFNDLLFUNC lpfnDllFunc;

 HINSTANCE hInst = LoadLibrary("E:\\ MyDll\\Debug\\MyDll.DLL");

 if (hInst == NULL)
  MessageBox("err", NULL, MB_OK);
 else
  MessageBox("ok", NULL, MB_OK);

 lpfnDllFunc = (LPFNDLLFUNC)GetProcAddress(hInst, "Max");

 if (lpfnDllFunc == NULL)
  MessageBox("err get", NULL, MB_OK);
 else {
  int a;
  CString str = "";
  a = lpfnDllFunc(1,2);
  str.Format("a:%d",a);
  MessageBox(str, NULL, MB_OK);
 }
 FreeLibrary(hInst);
7、 编译运行成功。

  Dll调用已经可以了。那么接下来让我们来看看,如何调试Dll程序。Dll程序本身是不可以启动运行的,必须依赖与应用程序的帮忙。继续我们上面的例子。
1、 右键点击工程TestDll->Setting->Link->import->object/library中输入MyDll.lib路径。
2、 在程序中导入Dll头文件。#include "MyDll2.h"
3、 在程序中加入以下代码。
  int a;
  CString str = "";
  a = Max(1,2);
  str.Format("a:%d",a);
  MessageBox(str, NULL, MB_OK);
4、 编译,这时编译器会提示找不到指定的头文件。(因为不了解原理,我在这里卡了N久)这里需要设置一下。右键点击工程TestDll->Setting->C/C++-> processor->include file path中输入要引用头文件的地址(.\,..\)。
5、 将生成的MyDll.dll文件拷贝至TestDll工程下的Debug目录下。
6、 在MyDll工程中设置断点,并将其设置为默认动行的程序。运行时会弹出对话框,选择TestDll.exe即可。(这种方法在每次改掉代码后都得重新拷贝Dll,比较麻烦,更好的办法现在还没找到,还希望知道的朋友不吝赐教)

  

    好像试试还不行,在VS2008下,工程右键->properties->debugging->Command->设置要调用的工程路径,注意,必须是Debug,否则无法调试,如“D:\Projects\Pioneer\Src\Debug\PnrNetCfg.exe”

 

 

你可能感兴趣的:(windows)