WEB页面通过ActiveX控件调用DLL动态库(四):VS2013编写ATL DLL(ActiveX)(静态/动态)调用DLL

本文为系列教程的终节,
在第一节中介绍了如何使用vs2013快速编写自己的DLL;
在第二节中介绍了如何使用vs2013编写C++程序静态/动态的调用自己的DLL;
在第三节中介绍了如何使用vs2013编写自己的ATLDLL,并通过WEB页面进行调用;
在本节中,将通过改造第三节中ATLDLL,使其静态/动态的调用第一节中的DLL。通过WEB页面再调用ATLDLL,达到WEB - ATLDLL - DLL的目的。
(一)ActiveX 动态调用DLL
1.为了方便,复制一份第三节所创建的工程文件夹,更名为ATLtest_dynamic
2.在头文件ATLtestdemo.h中,添加一下程序:

// ATLtestdemo.h : CATLtestdemo 的声明

#pragma once
#include "resource.h"       // 主符号
#include <windows.h> //添加 
#include "ATLtest_i.h"

#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endif
using namespace ATL;

// CATLtestdemo
class ATL_NO_VTABLE CATLtestdemo :
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<CATLtestdemo, &CLSID_ATLtestdemo>,
	public IDispatchImpl<IATLtestdemo, &IID_IATLtestdemo, &LIBID_ATLtestLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
	//以下三行实现定义。 
	typedef int(*AddFunc)(int, int); //类型定义,对应DLL ADD方法。Func自定义,随便写。 
	HINSTANCE hInstLibrary;
	AddFunc _AddFunc; //类映射 
	CATLtestdemo()
	{
		//开始调用DLL,进行计算。 
		hInstLibrary = LoadLibrary(L"C:\\Users\\dell\\Desktop\\testDLL\\testDLL\\Release\\testDLL.dll");//把写好的DLL文件放在此项目生成的目录下 
		if (hInstLibrary == NULL)
		{
			FreeLibrary(hInstLibrary);//资源释放 
		}
		else{
		}
		//调用方法,返回方法句柄。 
		_AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
	}
	DECLARE_REGISTRY_RESOURCEID(IDR_ATLTESTDEMO)

BEGIN_COM_MAP(CATLtestdemo)
	COM_INTERFACE_ENTRY(IATLtestdemo)
	COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

	DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct()
	{
		return S_OK;
	}

	void FinalRelease()
	{
			FreeLibrary(hInstLibrary);
	}
public:
	STDMETHOD(multip)(LONG a, LONG b, LONG* out);
};
OBJECT_ENTRY_AUTO(__uuidof(ATLtestdemo), CATLtestdemo)

注意:hInstLibrary = LoadLibrary(L"C:\Users\dell\Desktop\testDLL\testDLL\Release\testDLL.dll");为调用DLL的绝对路径。
3.修改ATLtestdemo.cpp文件

STDMETHODIMP CATLtestdemo::multip(LONG a, LONG b, LONG* out)
{
	// TODO:  在此添加实现代码
	int sum = this->_AddFunc(static_cast<int>(a), static_cast<int>(b));
	*out = static_cast<LONG>(sum);
	this->_AtlFinalRelease();
	return S_OK;
}

4.编译生成ATLtest.DLL,进行windows的注册,参考第三节方法。
5.通过web页面调用,参考第三节。
(二)ActiveX 静态调用DLL
1.为了方便,复制一份第三节所创建的工程文件夹,更名为ATLtest_static
2.将第一节生成testDLL.dll与testDLL.lib,与testDLL.h文件复制到工程目录下:
在这里插入图片描述
2.在ATLtestdemo.cpp文件添加头文件"testDLL.h",修改ATLtestdemo.cpp文件

STDMETHODIMP CATLtestdemo::multip(LONG a, LONG b, LONG* out)
{
	// TODO:  在此添加实现代码
	int mul = Add( static_cast<int>(a), static_cast<int>(b) );
	*out = static_cast<LONG>(mul);
	return S_OK;
}

直接调用dll所暴露出的接口。
3.右键解决方案,属性,c/c++,常规,附加包含目录,选择包含testDLL.dll与testDLL.lib,与testDLL.h文件的文件夹目录。
在这里插入图片描述
3.附加库目录也上面一样。可参考第两节加成教程。在这里插入图片描述
4.填写testDLL.lib
在这里插入图片描述
5.编译生成DLL。
6.将ATLtest.dll与testDLL.dll与testDLL.lib,与testDLL.h文件一起复制到SysWOW64文件夹中。然后注册。
在这里插入图片描述
7.WEB调用。
至此此教程完结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值