关闭

再次显式加载DLL

标签: DLL
150人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:29320次
    • 积分:1260
    • 等级:
    • 排名:千里之外
    • 原创:101篇
    • 转载:8篇
    • 译文:0篇
    • 评论:2条
    最新评论