再次显式加载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动态库的创建,隐式加载和显式加载

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

显式加载DLL并使用 DLL 中的类(原创)

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

DLL的显式调用与隐式调用

一直没分清楚,今天算是彻底明白了。 隐式调用 编译程序时需要头文件、lib文件,运行时需要DLL文件,并且运行过程中DLL文件一直被占用。 显式调用 编译时什么都不需要,在需要使用DLL中的函...
  • kencaber
  • kencaber
  • 2016年02月07日 11:14
  • 3970

C++ dll的隐式与显式调用

 转载自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html   应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显...
  • xiamentingtao
  • xiamentingtao
  • 2016年04月04日 00:24
  • 4238

Qt调用qt生成的dll 显式和隐式(静态动态)

昨天突然想到 :接触了这么久的qt了  dll(动态链接库)还没有用过就打算事件一下  差了半天资料 感觉网上没有一片文章讲述的全面详细,于是就有个这篇博客。 环境:win7+qt5.3.2 开始...
  • xiaobai_2511
  • xiaobai_2511
  • 2016年05月27日 17:01
  • 1098

Qt隐式/显式调用DLL

下面是我对Qt隐式/显式调用DLL一点理解,我参考的相关网址会在下面罗列出来: ①显示调用 这里我觉得http://www.cnblogs.com/newstart/archive/201...
  • spenghui
  • spenghui
  • 2014年12月27日 15:07
  • 2228

VC++显式(静态)调用、隐式(动态)调用及调试DLL

DLL 文件编写方法: 1、建立DLL工程 2、声明、定义要导出的函数 BOOL WINAPI InitDlg( HWND hTabctrl,TShareMem* pTshare,CRect* p...
  • u010102226
  • u010102226
  • 2015年04月21日 17:11
  • 553

C++ 显式调用DLL

1. DLL直接放到DEBUG目录下即可 2,程序中加入代码:例如DLL名为SendRcv.dll,方法名为Int ReadCard(char a[], char b[]) typedef...
  • Sayesan
  • Sayesan
  • 2015年11月18日 15:32
  • 531

C#调用C++写的Native DLL

C#部份 namespace testInteroperability { class MsgBoxTest { [DllImport("user32.dll")] ...
  • lee353086
  • lee353086
  • 2012年09月20日 10:56
  • 4007

VS2010创建和显式调用dll

最简单调用dll的方法
  • qq229873466
  • qq229873466
  • 2015年11月29日 22:13
  • 867
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:再次显式加载DLL
举报原因:
原因补充:

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