再次显式加载DLL

原创 2015年07月11日 18:54:37

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

风行者引领群雄者行风



相关文章推荐

显式加载dll

动态链接库有显式加载和隐式两种方式,隐式加载比较常见,本文介绍显示加载的方法。 头文件不需要任何写什么,直接写需要导出的函数 例如 //MyImageProcess.h #define LIN...

DLL动态库的创建,隐式加载和显式加载

动态库的创建 打开VS,创建如下控制台工程,工程命名为DllTest: 在弹出的对话框中选择“DLL”后单击“完成”按钮: 在工程中新建DllTest.h和DllTest.cpp...
  • dcrmg
  • dcrmg
  • 2016年12月02日 20:32
  • 967

c++显式加载dll并使用DLL的类

转载自:  http://blog.163.com/tianjunqiang666@126/blog/static/8725911920121064573594/ 首先需要强调,当使用某...

c++显式加载dll并使用DLL的类

转载自:  http://blog.163.com/tianjunqiang666@126/blog/static/8725911920121064573594/ 首先需要强调,...

c++显式加载dll并使用DLL的类

转载自:  http://blog.163.com/tianjunqiang666@126/blog/static/8725911920121064573594/ 首先需要强调,...

Windows/MFC中_显式加载DLL并使用 DLL 中的类(原创)

显式加载DLL并使用 DLL 中的类(原创) 首先需要强调,当使用某个类时一般目的有二:实例化成对象或者继承它产生新类。 对于前者,我们可以构造一个抽象类(java里的接口)来连接调用方和DLL。...

动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)

静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件组织成一个 .exe 文件,程序运行时,将全部数据加载到内存。 如果程序体积较大,功能较为复杂,那么加载到内存中的时间就会比较长,...

显式卸载DLL模块

当进程中的线程不再需要DLL中的引用符号时,可以从进程的地址空间中显式卸载DLL,方法是调用下面的函数:     BOOL FreeLibrary(HINSTANCE hinstDll); ...

显式链接DLL的实例

  • 2008年03月05日 21:42
  • 175KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:再次显式加载DLL
举报原因:
原因补充:

(最多只允许输入30个字)