再次显式加载DLL

显示加载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);
}

风行者引领群雄者行风



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值