主程序加载动态链接库(类方法)(动态加载)

时间:2021-03-27 15:50:55

1:新建一个空的动态链接库工程(动态调用外部dll类方法,必须在该类的程序中写出具体导出函数(标红的部分),外部程序直接调用dll类中导出的函数(标蓝的部分))。

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

 

 

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

 

 

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

 

 

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

 

 

 

2: 为该工程添加一个C++头文件:XX.h

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

 

 

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

给导出的类Point添加标识符(_declspec(dllexport))用于导出

 

class _declspec(dllexport) Point

{

public:

         void output(int x,int y);

};

 

 

 

3:为该工程添加一个C++源文件:XX.cpp

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

 

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

 

 

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

void Point::output(int a ,int b)

{       

         //返回调用者进程当前正在使用的那个窗口的句柄

         HWND hwnd=GetForegroundWindow();

         //获取DC

         HDC hdc=GetDC(hwnd);

         char buf[20];

         memset(buf,0,20);

         sprintf(buf,"x=%d,y=%d",a,b);

         //输出坐标

         TextOut(hdc,0,0,buf,strlen(buf));

         //释放DC

         ReleaseDC(hwnd,hdc);

   

}

extern "C" _declspec(dllexport) void show(int a,int b) //用于外部主程序调用类的方法

{

   Point pt;

   pt.output(a,b);

}

4:将每次更新动态链接库Debug文件中的ClassDll.dllClassDll.lib拷贝到主程序的根目录下

注意:(动态加载动态链接库:不需要将生成动态链接库文件中的头文件加载到调用程序中,同时也不需要将.lib文件复制到调用文件的根目录下。只需要将.dll复制到调用文件的根目录下即可)

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

 

 

 

 

 

主程序加载动态链接库(类方法)(动态加载)

 

 

 

 

 

 

5:程序调用(因为动态链接库中show函数前加入extern "C"(如上标红的代码)因此名字导出时不发生名字改编也就是不会变成?show@@YAXHH@Z(参考Doc使用dumpbin导入数据……文档),所以在调用程序中GetProcAddress函数的参数直接写为show(如果动态链接库中show函数发生名字改编则调用程序中GetProcAddress参数为?show@@YAXHH@Z))

 

void CTestDlg::OnButAdd()

{

  HINSTANCE hInst;   //定义一个实例句柄对象

  hInst=LoadLibrary("ClassDll.dll");   //动态加载Dll

  typedef void (*ADDPROC)(int a,int b);    //定义函数指针类型

  ADDPROC Output=(ADDPROC)GetProcAddress(hInst,"show");//调用dll类中的方法

  if(!Output)

  {

           MessageBox("获取函数地址失败");

           return;

  }

  Output( 90, 9);

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

主程序加载动态链接库(类方法)(动态加载)

作者:biolee   总结于:10.6.18   发表于:10.7.16