张晓华的博客

        2005年,最后一场雪,还是下了,虽然凄凉了一些!
posts - 185, comments - 100, trackbacks - 8, articles - 1

MFC 中的 DLL 编写与使用

Posted on Monday, June 23, 2008 1:45 AM
1 编写 DLL
    a)   使用vs2005向导生成DLL项目
    b)   在 xxx.h文件中添加导出的方法
  extern   "C" void __stdcall/__fastcall/__cdecl   MethodName(void);   
  或者
  extern   "C"   void  fastcallproc(void);  
  区别在于后者
  c)    在xxx.cpp中添加实现方法
  extern CMyTestApp theApp;  //可以声明一个对象实例,在后面使用
  extern   "C" void cdeclx(int i)  
  {
      theApp.cdeclx(i);  // 使用前面的对象实例,调用类中的方法
  } 
  extern   "C"   void     _cdecl   cdeclproc(void)    // 和前面.h中的写法是完全一样的
  {
      ::MessageBox(0,_T("cdecl   function   "),_T("dll   call"),0); 
  } 
  extern   "C"   void     _fastcall   fastcallproc(void) 
  { ::MessageBox(0,_T("fastcall   function   "),_T("dll   call"),0); 
  }  
    extern   "C"   int   add (int i,int j)
  { 
      CString s=CString("%d",theApp.add(i,j));
      ::MessageBox(0,s,_T("dll   call"),0); 
      return theApp.add(i,j);
  }  
 
    d) 完成以上步骤后,进行编译,形成LIB,EXP,DLL等文件
   
2 隐式调用 DLL
   a)  使用vs2005向导添加MFC App程序
   b)  在程序代码 .h或者 .cpp前面添加 DLL的.h文件和LIB地址    
              #include "..\MyTest\MyTest.h"
              //链接输入库文件 
              #pragma   comment(lib,"..\\debug\\MyTest.lib")  
    c) 在程序代码中可以直接使用导出的方法
        void CDllCallerDlg::OnBnClickedButtona()
                {
                         ::cdeclx(1);
                }

2 显式调用 DLL  
    a)  使用vs2005向导添加MFC App程序
    b)  在程序代码中可以仿照下例使用导出的方法
        void CDllCallerDlg::OnBnClickedButtona()
                {
                     //声明DLL函数
                   typedef int (_cdecl *cdeclx)(int i);   
                    //声明函数句柄
                      HMODULE hTestDLL = NULL;
                       cdeclx cdeclX = NULL;
                      // 加载动态链接库
                      hTestDLL = LoadLibrary("TestDLL.dll");
                      if(hTestDLL == NULL){
                        MessageBox(NULL,_T("cannot load LCDDLL.dll"),_T("错误"),0);
                      return;
                      }
                       /*** 找到每个函数的入口 ****/
                    cdeclX = (cdeclx)GetProcAddress(hTestDLL,"cdeclx");
                  if(cdeclX==NULL)
                  {
                    MessageBox(NULL,_T("cannot load process cdeclX"),_T("错误"),0);
                  FreeLibrary(hTestDLL);
                  return;
                  }
                       //执行方法
                    int x=(*cdeclX)(100);
                       //结束
                }  
 

Post Comment

Title  
Name  
Url
Comment   
Protected by Clearscreen.SharpHIPEnter the code you see: