本文为系列教程的终节,
在第一节中介绍了如何使用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调用。
至此此教程完结。