显示加载DLL过程比较简单 DLL文件复制到DEBUG文件下就可以了
<strong><span style="color:#990000;">显示调用DLL的类比较复杂 暂时放弃</span></strong> 可以隐式调用
DLL工程
.h
#ifndef __JISUAN_0710A__
#define __JISUAN_0710A__ _declspec(dllimport)
#endif
#ifndef __JISUAN_0710A_EXTERN_C__
#define __JISUAN_0710A_EXTERN_C__
#endif
//#include <afxwin.h>
#include <Windows.h> //这样win32 DLL工程也能用WINAPI
#include <stdio.h>
class __JISUAN_0710A__ student //显示调用DLL的类复杂 暂时放弃 可以隐式调用
{
public:
void output(int x,int y);
};
__JISUAN_0710A_EXTERN_C__ __JISUAN_0710A__ int add(int,int);
__JISUAN_0710A_EXTERN_C__ __JISUAN_0710A__ int substract(int,int);
__JISUAN_0710A_EXTERN_C__ __JISUAN_0710A__ int multi(int,int);
__JISUAN_0710A_EXTERN_C__ __JISUAN_0710A__ int divide(int,int);
//如果不加extern "C" ,应用程序代码GetProcAddress(hinst,"add");就要改为
// <span style="white-space:pre"> </span>GetProcAddress(hinst,"add@@YAHHH@Z");很不方便
//一共导出4个全局函数和一个类
.cpp
#define __JISUAN_0710A__ _declspec(dllexport)
#define __JISUAN_0710A_EXTERN_C__ extern"C"
#include "jisuan.h"
void student::output(int x,int y)
{
//返回调用者进程当前正在使用的那个窗口的句柄
HWND hwnd=::GetForegroundWindow();
//获取DC
HDC hdc=::GetDC(hwnd);
char buf[20];
::memset(buf,0,20);
::sprintf_s(buf,"x=%d,y=%d",x,y);
//输出坐标
::TextOutA(hdc,0,0,buf,strlen(buf));
//释放DC
::ReleaseDC(hwnd,hdc);
}
int add(int a,int b)
{
return a+b;
}
int substract(int a,int b)
{
return a-b;
}
int multi(int a,int b)
{
//student A; //实验发现 全局函数中使用类是可以的 尽管类没有在应用程序中声明
//A.output(123,456);
return a*b;
}
int divide(int a,int b)
{
if(b==0)
{
return 12345;
}
return a/b;
;
}
测试工程
void Ctest0710ADlg::OnBnClickedAdd()
{
// TODO: Add your control notification handler code here
HINSTANCE hinst;
hinst=::LoadLibraryA("0710A.dll");
typedef int(*ARITHMETIC)(int,int);
ARITHMETIC add=(ARITHMETIC)::GetProcAddress(hinst,"add"); //返回函数地址赋给指针
if(!add)
{
::AfxMessageBox("获取函数地址失败!");
return;
}
this->UpdateData(TRUE);
this->m_Z=add(this->m_A,this->m_B);
this->UpdateData(FALSE);
}
风行者引领群雄者行风